所以,在D3D和OpenGL中都有从索引缓冲区绘制的功能。
然而,OBJ文件格式做了一些奇怪的事情。它指定了一堆顶点,如:
v -21.499660 6.424470 4.069845 v -25.117170 6.418100 4.068025 v -21.663851 8.282170 4.069585 v -21.651890 6.420180 4.068675 v -25.128481 8.281520 4.069585
然后指定了一堆法向量,如:
vn 0.196004 0.558984 0.805680 vn -0.009523 0.210194 -0.977613 vn -0.147787 0.380832 -0.912757 vn 0.822108 0.567581 0.044617 vn 0.597037 0.057507 -0.800150 vn 0.809312 -0.045432 0.585619
然后指定了一堆纹理坐标,如:
vt 0.1225 0.5636 vt 0.6221 0.1111 vt 0.4865 0.8888 vt 0.2862 0.2586 vt 0.5865 0.2568 vt 0.1862 0.2166
然后在模型上指定了“面”:
f 1/2/5 2/3/7 8/2/6 f 5/9/7 6/3/8 5/2/1
在这里,我们v/t/n,第一个数字是顶点数组中的索引,第二个数字是纹理坐标数组中的索引,第三个数字是法线数组中的索引。
因此,在使用顶点缓冲区进行渲染时,
在OpenGL中,我可以使用glVertexPointer
,glNormalPointer
和glTexCoordPointer
分别设置指向每个顶点、法线和纹理坐标数组的指针...但是当涉及到使用glDrawElements
绘制时,我只能指定一个索引集,即它在访问顶点时应该使用的索引。
好吧,那接下来呢?我仍然有3组要访问的索引。
在d3d中,情况也差不多——我可以设置3个流:一个用于顶点,一个用于纹理坐标,一个用于法线,但是当涉及到使用IDirect3DDevice9::DrawIndexedPrimitive时,我仍然只能指定一个索引缓冲区,它将索引到顶点数组。
那么,使用每个顶点、纹理坐标和法线缓冲区的不同索引数组从顶点缓冲区绘制是可能的吗(无论是d3d还是opengl!),还是必须创建一个单一的交错数组,然后访问它?