我使用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'函數不會告訴任何人,因爲它沒有做任何與紋理有關的事情。 –