OpenGLの頂点バッファオブジェクトを使用して2セットのジオメトリをレンダリングしています。1つはテクスチャあり、もう1つはテクスチャなしです。レガシーコードのため、プログラム可能なパイプラインを使用していません。
私が見つけたのは、最初にテクスチャジオメトリをレンダリングし、次に非テクスチャジオメトリをレンダリングすると、すべてが良好に見えるということです。しかし、逆にすると、テクスチャジオメトリは描画されません。
インターリーブされた配列を使用しています。レンダリングコードは次のとおりです。
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();
私は何が間違っているのですか?