我是 OpenGL (和GLSL)的新手,使用glTexCoordPointer()时遇到了问题。

我已经加载了纹理,并且可以正确地在对象上渲染(一个四边形),但是我还出现了另一个四边形,它是一种单色,不是已加载纹理的一部分。

数组定义如下:

static const GLfloat obj_vert_buf[] = {
    -1, 0, -1,
    -1, 0, 1,
    1, 0, 1,
    1, 0, -1
};

static const GLfloat obj_tex_buf[] = {
    0, 0,
    0, 1,
    1, 1,
    1, 0
};

以及来自draw函数的相关摘录:
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY_EXT);

glGenBuffers(1, &obj_id);

glTexCoordPointer(2, GL_FLOAT, 0, obj_tex_buf);
glVertexPointer(3, GL_FLOAT, 0, obj_vert_buf);
glDrawArrays(GL_QUADS, 0, sizeof(obj_vert_buf) / sizeof(GLfloat));

glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY_EXT);

据我所知,glTexCoordPointer()的第一个参数指定每个顶点的元素数量,该数量为两个,如下所示:
glTexCoord2f(0.0, 0.0);

第二个参数是类型GLfloat

第三个参数是与每个顶点相关的每个元素集之间的偏移量,因此在前面所述的两个元素之后为零(我也尝试过使用2 * sizeof(GLfloat)使其保持不变)。

第四个参数是指向数据开头的指针,即obj_tex_buf

四边形可以正确渲染并正确绘制纹理,但是我得到另一个随机形状从其中心脱落并纹理不正确,任何想法都会很棒。没有glTexCoordPointer()行,其他四边形不可见。

最佳答案

docs:

count
Specifies the number of indices to be rendered.

因此,您必须调用glDrawArrays(GL_QUADS, 0, 4);
请注意,从OpenGL 3.1开始,不再正式支持GL_QUADS

09-28 14:28