带有交错缓冲区的openGL glDrawElements

时间:2009-03-06 13:20:32

标签: c++ opengl vertex-buffer

到目前为止,我只使用了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不能重新排列以与第一个共享相同的索引列表,那么最好的方法是什么?渲染。

2 个答案:

答案 0 :(得分:5)

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

一样。

答案 1 :(得分:0)

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

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