Вывод glTexCoordPointer не соответствует ожидаемому

Я пытаюсь использовать glDrawElements , glTexCoordPointer а также glTexImage1D чтобы создать 1D текстуру, визуализируйте набор данных поверхности и раскрасьте вершины в соответствии со значением их высоты.

GLuint tex = 0;

Мое поколение текстур:

glGenTextures( 1, &tex );
glBindTexture( GL_TEXTURE_1D, tex );
unsigned char pixels[] =
{
255, 0, 0, 255,
0, 255, 0, 255,
0, 0, 255, 255,
};
glTexImage1D( GL_TEXTURE_1D, 0, GL_RGBA, 3, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels );
glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL );
glTexParameteri( GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
glTexParameteri( GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
glTexParameteri( GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );

vArray массив, в котором хранятся вершины для рендеринга

float vArray[12] = {
0.0, 1.0, 0.0,
0.0, 3.0, 1.0,
1.0, 2.0, 0.0,
1.0, 1.0, 1.0,
}

iArray массив, в котором хранятся индексы для рендеринга

int iSize = 6;
int iArray[6] = {
0, 2, 1,
2, 1, 4,
}

tArray массив, который хранит нормализованные высоты

GLfloat tArray[4] = {
0.0, 0.3, 1.0, 0.0,
}

Мой код рендеринга:

  glEnable(GL_TEXTURE_1D);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glBindTexture(GL_TEXTURE_1D, tex);
glTexCoordPointer(1, GL_FLOAT, sizeof(GL_FLOAT), tArray);

glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3 ,GL_FLOAT,0, vArray);

glDrawElements(GL_TRIANGLES, iSize, GL_UNSIGNED_INT, iArray);

glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisable(GL_TEXTURE_1D);

Окончательный результат не такой, как я ожидал, надеясь, что кто-нибудь укажет на мои ошибки.

1

Решение

  • RE: ваш glTexCoordPointer() Вызов: плотно упакованные массивы обычно используют 0 за stride,
  • vArray а также tArray только четыре элемента, а не пять, поэтому 4 в iArray заставит OpenGL считывать концы этих массивов в мусор (если вам повезет) или в segfaults (если нет).

Все вместе:

#include <GL/glew.h>
#include <GL/glut.h>

GLuint tex = 0;
void display()
{
glClear( GL_COLOR_BUFFER_BIT );

float vArray[] =
{
-0.5, -0.5,
0.5, -0.5,
0.5,  0.5,
-0.5,  0.5,
};

GLfloat tArray[] =
{
0.0, 0.3, 1.0, 0.0,
};

unsigned int iArray[] =
{
0, 1, 2,
2, 3, 0,
};

glEnable( GL_TEXTURE_1D );
glBindTexture( GL_TEXTURE_1D, tex );
glEnableClientState( GL_TEXTURE_COORD_ARRAY );
glTexCoordPointer( 1, GL_FLOAT, 0, tArray );

glEnableClientState( GL_VERTEX_ARRAY );
glVertexPointer( 2, GL_FLOAT, 0, vArray );

glDrawElements( GL_TRIANGLES, 6, GL_UNSIGNED_INT, iArray );

glDisableClientState( GL_TEXTURE_COORD_ARRAY );
glDisableClientState( GL_VERTEX_ARRAY );
glDisable( GL_TEXTURE_1D );

glutSwapBuffers();
}

int main( int argc, char** argv )
{
glutInit( &argc, argv );
glutInitDisplayMode( GLUT_RGBA | GLUT_DOUBLE );
glutInitWindowSize( 400, 400 );
glutCreateWindow( "GLUT" );
glewInit();

glGenTextures( 1, &tex );
glBindTexture( GL_TEXTURE_1D, tex );
unsigned char pixels[] =
{
255, 0, 0, 255,
0, 255, 0, 255,
0, 0, 255, 255,
};
glTexImage1D( GL_TEXTURE_1D, 0, GL_RGBA, 3, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels );
glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL );
glTexParameteri( GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
glTexParameteri( GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
glTexParameteri( GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );

glutDisplayFunc( display );
glutMainLoop();
return 0;
}

РЕДАКТИРОВАТЬ: 2D версия:

#include <GL/glew.h>
#include <GL/glut.h>

GLuint tex = 0;
void display()
{
glClear( GL_COLOR_BUFFER_BIT );

float vArray[] =
{
-0.5, -0.5,
0.5, -0.5,
0.5,  0.5,
-0.5,  0.5,
};

GLfloat tArray[] =
{
0.0, 0.0,
1.0, 0.0,
1.0, 1.0,
0.0, 1.0,
};

unsigned int iArray[] =
{
0, 1, 2,
2, 3, 0,
};

glEnable( GL_TEXTURE_2D );
glBindTexture( GL_TEXTURE_2D, tex );
glEnableClientState( GL_TEXTURE_COORD_ARRAY );
glTexCoordPointer( 2, GL_FLOAT, 0, tArray );

glEnableClientState( GL_VERTEX_ARRAY );
glVertexPointer( 2, GL_FLOAT, 0, vArray );

glDrawElements( GL_TRIANGLES, 6, GL_UNSIGNED_INT, iArray );

glDisableClientState( GL_TEXTURE_COORD_ARRAY );
glDisableClientState( GL_VERTEX_ARRAY );
glDisable( GL_TEXTURE_2D );

glutSwapBuffers();
}

int main( int argc, char** argv )
{
glutInit( &argc, argv );
glutInitDisplayMode( GLUT_RGBA | GLUT_DOUBLE );
glutInitWindowSize( 400, 400 );
glutCreateWindow( "GLUT" );
glewInit();

glGenTextures( 1, &tex );
glBindTexture( GL_TEXTURE_2D, tex );
unsigned char pixels[] =
{
255, 0, 0, 255,
0, 255, 0, 255,
0, 0, 255, 255,
0, 0, 255, 255,
};
glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels );
glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );

glutDisplayFunc( display );
glutMainLoop();
return 0;
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]