我使用OpenGL中的顶点缓冲区对象渲染两组几何体 - 一个是纹理,另一个是没有纹理。由于遗留代码,我没有使用可编程管道。OpenGL顶点缓冲区对象和纹理与非纹理几何图形的排序
我发现的是,如果我先渲染纹理几何图形,然后再渲染非纹理几何图形,一切看起来都不错。但是如果我做相反的话,纹理几何图形就不会绘制出来。
我使用的交错阵列,这里是渲染代码:
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();
我在做什么错?
听起来像一个很好的旧*“OpenGL是一个状态机”* - 问题。 –
你的代码在哪里绑定纹理本身?我敢打赌,它被绑定在通话之前,然后它在第一次渲染之后解除绑定并且不再被绑定。 (或者也可能以类似的方式打开/关闭另一个OpenGL状态。) –
请显示其余代码。尤其是启用和绑定纹理,调用'MyClass :: render'等等。当然,你的'render'函数不会告诉任何人,因为它没有做任何与纹理有关的事情。 –