2011-05-24 115 views
1

使用OpenGL 1.1和Matrix Palette擴展。我遇到的問題是,並非每個加載的模型都需要動畫,所以我認爲我不需要啓用這些客戶端狀態,也不需要提供權重或權重索引數組。例如,我在繪圖代碼中嘗試類似這樣的東西...MatrixView Palette,ModelView Matrix時的繪圖問題

glMatrixMode(GL_MATRIX_PALETTE_OES); 

glBindBuffer(GL_ARRAY_BUFFER, dataBuffers[0]); 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, dataBuffers[1]); 

glEnableClientState(GL_VERTEX_ARRAY); 
glEnableClientState(GL_NORMAL_ARRAY); 
glEnableClientState(GL_COLOR_ARRAY); 
glEnableClientState(GL_WEIGHT_ARRAY_OES); 
glEnableClientState(GL_MATRIX_INDEX_ARRAY_OES); 

//Code to modify the palettes... works fine... 
for(i = 0; i < mech.boneCount; ++i){ 
    glCurrentPaletteMatrixOES(i); 
    glLoadPaletteFromModelViewMatrixOES(); 

    GenerateBoneMatrixPalette(bones, i); 
} 

glVertexPointer(3, GL_FLOAT, sizeof(VertexData), (char*)(NULL + 0)); 
glNormalPointer(GL_FLOAT, sizeof(VertexData), (char*)(NULL + 12)); 
glColorPointer(4, GL_UNSIGNED_BYTE, sizeof(VertexData), (char*)(NULL + 24)); 
glWeightPointerOES(1, GL_FLOAT, sizeof(VertexData), (char*)(NULL + 28)); 
glMatrixIndexPointerOES(1, GL_UNSIGNED_BYTE, sizeof(VertexData), (char*)(NULL + 32)); 
glDrawElements(GL_TRIANGLES, mech.indexsize, GL_UNSIGNED_SHORT, (char*)(NULL + 0)); 

glDisableClientState(GL_VERTEX_ARRAY); 
glDisableClientState(GL_NORMAL_ARRAY); 
glDisableClientState(GL_COLOR_ARRAY); 
glDisableClientState(GL_WEIGHT_ARRAY_OES); 
glDisableClientState(GL_MATRIX_INDEX_ARRAY_OES); 

glBindBuffer(GL_ARRAY_BUFFER, dataBuffers[2]); 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, dataBuffers[3]); 

glMatrixMode(GL_MODELVIEW); 

glEnableClientState(GL_VERTEX_ARRAY); 
glEnableClientState(GL_NORMAL_ARRAY); 
glEnableClientState(GL_COLOR_ARRAY); 

//pardon the hard 28 value here, it's the correct offset for this test 
glVertexPointer(3, GL_FLOAT, 28, (char*)(NULL + 0)); 
glNormalPointer(GL_FLOAT, 28, (char*)(NULL + 12)); 
glColorPointer(4, GL_UNSIGNED_BYTE, 28, (char*)(NULL + 24)); 
glDrawElements(GL_TRIANGLES, indexsize, GL_UNSIGNED_SHORT, (char*)(NULL + 0)); 

glDisableClientState(GL_VERTEX_ARRAY); 
glDisableClientState(GL_NORMAL_ARRAY); 
glDisableClientState(GL_COLOR_ARRAY); 

glBindBuffer(GL_ARRAY_BUFFER, 0); 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); 

但它不工作。第一部分正確顯示,但第二部分完全不顯示。如果我添加一個,感覺是什麼,不必要的重量和重量索引元素到第二部分根據需要修改步幅,而不是將矩陣設置到模型視圖...然後它顯示我期望的。

感覺最奇怪的測試是,如果我根本不啓用Matrix調色板擴展並只繪製第二部分,它工作得很好。但是,只是啓用Matrix Palette擴展會導致第二部分根本無法工作,這使得我無法簡單地在模式設置爲ModelView矩陣時繪製...雖然這看起來有點不尋常,因爲ModelView仍然是絕對的受轉型影響。

因此......使用此擴展名時,是否可以切換到並繪製ModelView是當前矩陣?或者我必須使用/重複使用一個調色板才能使其工作。

回答

1

我還沒有在擴展註冊表中找到OES矩陣調色板擴展,但是有一個ARB擴展,並且假設它的工作原理類似。在此擴展中,您必須啓用GL_MATRIX_PALETTE和或GL_VERTEX_BLEND(與glEnable)才能使用矩陣調色板蒙皮並禁用它以不使用它。

但glMatrixMode與啓用或禁用它無關。它只是選擇適用矩陣修改功能的矩陣(如glLoadIdentity,glTranslate,...)。

編輯:谷歌搜索這個擴展(我沒有ES經驗)我發現,你一定要能夠GL_MATRIX_PALETTE_OES使用它(通過glEnable),然後你的第二個部分再次關閉不使用後它。正如我上面寫的,glMatrixMode不會做你認爲的事情。

+0

ARB擴展的OES實現非常相似,但並沒有完全相同的功能(例如,您無法獲取當前矩陣)。不過,如果這是一個啓用和禁用的問題,我會試一試。您是否知道在啓用/禁用此功能時是否存在大量開銷? – Maximus 2011-05-25 03:11:41

+0

跟進...是的,這確實奏效。我將不得不最終運行一些性能測試,以查看哪些更具問題,更多的權重/重量指數或額外的gl調用的內存。再次感謝。 – Maximus 2011-05-25 03:50:41

+0

@Maximus我懷疑,只是禁用矩陣調色板蒙皮比爲每個對象傳遞未使用的蒙皮數據更昂貴,而不是使用啓用蒙皮的重點頂點處理。所以只是禁用它應該是選擇的方法。你也可以按狀態排序你的對象。 – 2011-05-25 11:38:04