我使用OpenGL中的顶点缓冲对象渲染2组几何图形 - 一个具有纹理,一个没有。由于遗留代码,我没有使用可编程管道。
我发现如果我首先渲染纹理几何体,然后是非纹理几何体,那么一切看起来都很好。但如果我反过来,则不会绘制纹理几何体。
我正在使用交错数组,这里是渲染代码:
void MyClass::render()
{
// 3*v + 3*c + 3*n + (2*t)
const char *base = NULL;
GLsizei stride = _enableTexture ? 11*sizeof(GLfloat) : 9*sizeof(GLfloat);
GLvoid* vOffset = (GLvoid*)0;
GLvoid* cOffset = (GLvoid*)(3*sizeof(GLfloat));
GLvoid* nOffset = (GLvoid*)(6*sizeof(GLfloat));
GLvoid* tOffset = (GLvoid*)(9*sizeof(GLfloat));
// prepare vertex VBO
glBindBuffer(GL_ARRAY_BUFFER, _iBuffer);
// enable vertex array
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, stride, vOffset);
// enable color array
glEnableClientState(GL_COLOR_ARRAY);
glColorPointer(3, GL_FLOAT, stride, cOffset);
// enable normal array
glEnableClientState(GL_NORMAL_ARRAY);
glNormalPointer(GL_FLOAT, stride, nOffset);
// texture coords
if(_enableTexture) {
// enable texture array
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glTexCoordPointer(2, GL_FLOAT, stride, tOffset);
}
// draw geometry
glDrawArrays(GL_TRIANGLES, 0, _nVertices);
// disable/unbind
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_COLOR_ARRAY);
glDisableClientState(GL_NORMAL_ARRAY);
if(_enableTexture) {
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
}
glBindBuffer(GL_ARRAY_BUFFER, 0);
}
这有效:
myClassTextured->render();
myClassNonTextured->render();
这失败了:
myClassNonTextured->render();
myClassTextured->render();
我做错了什么?
答案 0 :(得分:1)
要检查两件事:
首先,如果_enableTexture
为假,则应在GL_TEXTURE_COORD_ARRAY
中停用render()
。正如 Tal 和 Christian 已经指出的那样,为什么不在GL_TEXTURE_2D
启用/禁用render()
?更容易理解和调试。
其次,您如何分配_iBuffer
并且之后可以_enableTexture
更改?如上所述,render()
方法仅在_iBuffer
为每个垂直分配9个浮点数时才有效,如果_enableTexture
为假,则为11,如果为真。但是如果为_iBuffer
分配足够的纹理坐标空间,无论你是否真的最终使用它们,步幅值应始终为11。