到目前为止,我只使用了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不能重新排列以共享与第一个相同的索引列表,那么渲染它的最佳方法是什么.
您不能为不同的列表使用不同的索引.当你指定时,glArrayElement(3)
OpenGL将采用每个列表的第3个元素.
您可以做的是使用您指定的指针进行播放,因为列表中最终访问的位置实际上是从列表的开头加上您指定的索引的指针偏移量.如果列表之间有一个常量偏移量,这将非常有用.如果列表只是一个随机排列,那么每个顶点的这种游戏可能就像使用普通旧的那样一样glVertex3fv()
,glNormal3fv()
而且glTexCoord3fv()