首页 文章

3个索引缓冲区

提问于
浏览
13

因此,在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

然后它指定了一堆像这样的tex coords

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第一个数字是顶点数组的索引,第二个是tex coord数组的索引,第三个是normals数组 .

因此,在尝试使用顶点缓冲区渲染时,

在OpenGL中我可以使用 glVertexPointerglNormalPointerglTexCoordPointer 分别设置指向每个顶点,法线和纹理坐标数组的指针..但是当它归结为使用 glDrawElements 进行绘制时,我只能指定 ONE 指数集,即索引它在访问顶点时应该使用 .

好的,那又怎样?我仍然有 3 套索引要访问 .

在d3d它大致相同 - 我可以设置3个流:一个用于顶点,一个用于texcoords,一个用于法线,但是当涉及到使用IDirect3DDevice9 :: DrawIndexedPrimitive时,我仍然只能指定 ONE 索引缓冲区,它将索引进入顶点数组 .

那么,是不是使用不同的索引数组为每个顶点,texcoord和普通缓冲区(EITHER d3d或opengl!)从顶点缓冲区绘制,或者我必须创建一个交错数组然后访问IT?

3 回答

  • 2

    我遇到了完全相同的问题并寻找解决方案 . 问题是许多顶点具有多于1个纹理坐标 . 我的解决方案是复制具有多于1个纹理坐标的数组中的每个顶点 .

    解决方案在这里:wavefront obj file format opengl vertex mapping

    但是,我想找到一个解决方案,保持顶点数据完整,以便在opencl之间进行帧处理,

    一种解决方案是限制每个顶点1个纹理坐标 . 我知道opengl每个顶点有多个纹理坐标 . 我如何使用glGenBuffersARB等我不知道 . 有人有建议吗?

  • 8

    OBJ不是为了映射到OpenGL或DirectX而设计的 .

    你说的一切都是真的,不,不可能使用每个属性索引 .

    您必须将OBJ表示转换为每个顶点仅使用一个索引的东西(可能在整个过程中复制一些顶点数据) .

  • 3

    你真正想要做的事情(从围栏的D3D一边讲,我不知道OpenGL对不起)是将OBJ加载到一个自定义顶点格式的数组中 - 这样你就有了一个带索引的结构,顶点,normal和tex coord,你可以使用一个DrawIndexedPrimtive渲染它 .

    我在这里误解了你的问题定义吗?我认为您需要提供更多细节 - 您不需要多个索引缓冲区来呈现单个OBJ文件(除非您故意批处理它) . 如果是这种情况,你是故意批处理它,那么你应该看一下DrawIndexedPrimitive的参数,它允许你指定VB中要使用的偏移量 .

相关问题