2012-11-01 58 views
0

我使用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(); 

我在做什麼錯?

+1

聽起來像一個很好的舊*「OpenGL是一個狀態機」* - 問題。 –

+0

你的代碼在哪裏綁定紋理本身?我敢打賭,它被綁定在通話之前,然後它在第一次渲染之後解除綁定並且不再被綁定。 (或者也可能以類似的方式打開/關閉另一個OpenGL狀態。) –

+0

請顯示其餘代碼。尤其是啓用和綁定紋理,調用'MyClass :: render'等等。當然,你的'render'函數不會告訴任何人,因爲它沒有做任何與紋理有關的事情。 –

回答

1

兩件事情來檢查:

首先,如果_enableTexture是假的,你應該在render()禁用GL_TEXTURE_COORD_ARRAY。正如TalChristian已經指出的那樣,您爲什麼不在render()中啓用/禁用GL_TEXTURE_2D?更容易理解和調試。

二,您如何分配_iBuffer並可以在_enableTexture之後更改?如書面所述,如果_enableTexture爲假,_iBuffer分配9個浮點數,如果爲真,則render()方法僅適用。但是如果你爲紋理座標分配_iBuffer有足夠的空間,無論你是否真的最終使用它們,步長值應該總是11.

+0

+1的步幅。聽起來很不錯。 –

相關問題