![](/img/trans.png)
[英]OpenGL glMultiDrawElementsIndirect with Interleaved Buffers
[英]openGL glDrawElements with interleaved buffers
到目前為止,我只使用了 glDrawArrays 並且想轉而使用索引緩沖區和索引三角形。 我正在繪制帶有紋理坐標、法線和頂點坐標的有點復雜的 object。 所有這些數據都被收集到一個交錯的頂點緩沖區中,並使用類似於(假設所有的 serup 都正確完成)的調用進行繪制:
glVertexPointer( 3, GL_FLOAT, 22, (char*)m_vertexData );
glNormalPointer( GL_SHORT, 22, (char*)m_vertexData+(12) );
glTexCoordPointer( 2, GL_SHORT, 22, (char*)m_vertexData+(18) );
glDrawElements(GL_TRIANGLES, m_numTriangles, GL_UNSIGNED_SHORT, m_indexData );
這是否允許 m_indexData 也與我的法線和紋理坐標的索引以及標准 position 索引數組交錯? 或者它是否假設一個單一的線性索引列表適用於整個頂點格式(POS、NOR、TEX)? 如果后者是真的,如何用不同的紋理坐標或法線渲染相同的頂點?
我想這個問題也可以改寫為:如果我有 3 個單獨的索引列表(POS、NOR、TEX),其中后 2 個不能重新排列以與第一個共享相同的索引列表,那么呈現它的最佳方法是什么。
不同的列表不能有不同的索引。 當您指定glArrayElement(3)
時, OpenGL 將采用每個列表的第三個元素。
您可以做的是使用您指定的指針,因為實際上最終訪問的列表中的位置是從列表開頭的指針偏移量加上您指定的索引。 如果列表之間有恆定的偏移量,這很有用。 如果列表只是一個隨機排列,那么每個頂點的這種游戲可能會像使用普通的舊glVertex3fv()
, glNormal3fv()
和glTexCoord3fv()
一樣昂貴
我在 Direct3D 9.0 中嘗試做同樣的事情時遇到了類似的問題
對於我的OpenGL 3 實現來說,這相當簡單,我的源代碼可以在線獲得,如果它對你有幫助的話... OpenGL3/GL3model.cpp
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.