4

到目前为止,我只使用了 glDrawArrays 并且想转而使用索引缓冲区和索引三角形。我正在用纹理坐标、法线和顶点坐标绘制一个有点复杂的对象。所有这些数据都被收集到一个交错的顶点缓冲区中,并使用类似于(假设所有的 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 也与我的法线和纹理坐标的索引以及标准位置索引数组交错?或者它是否假设一个单一的线性索引列表适用于整个顶点格式(POS、NOR、TEX)?如果后者是真的,如何用不同的纹理坐标或法线渲染相同的顶点?

我想这个问题也可以改写为:如果我有 3 个单独的索引列表(POS、NOR、TEX),其中后 2 个不能重新排列以与第一个共享相同的索引列表,那么呈现它的最佳方法是什么。

4

2 回答 2

5

不同的列表不能有不同的索引。当您指定时glArrayElement(3),OpenGL 将采用每个列表的第三个元素。
您可以做的是使用您指定的指针,因为实际上最终访问的列表中的位置是从列表开头的指针偏移量加上您指定的索引。如果列表之间有恒定的偏移量,这很有用。如果列表只是一个随机排列,那么这种对每个顶点的播放可能会像使用普通的 old 一样昂贵glVertex3fv()glNormal3fv()并且glTexCoord3fv()

于 2009-03-06T13:33:36.927 回答
0

我在 Direct3D 9.0 中尝试做同样的事情时遇到了类似的问题

对于我的 OpenGL 3 实现来说,它相当简单,如果它可以帮助你,我的源代码可以在线获得...... https://github.com/RobertBColton/enigma-dev/blob/master/ENIGMAsystem/SHELL/Graphics_Systems/ OpenGL3/GL3model.cpp

于 2013-08-30T19:03:00.907 回答