2013-06-02 205 views
0

我有点困惑,为什么你可以设置活动的顶点缓冲区数组,但只有一个索引缓冲区?那一个索引缓冲区能否解决所有顶点缓冲区的顶点?如果是这样,我将如何指定哪个缓冲区是哪个索引所属的?DX10 +多个顶点缓冲区,单个索引缓冲区

我的另一个问题是,因为我使用索引三角形列表,索引数据大小与每个网格的顶点数据大小基本相同。我正在考虑为每个顶点缓冲区创建一个索引缓冲区。我将动态添加网格物体,直到其中一个缓冲区耗尽为止,此时创建另一个缓冲区。不可避免地,通过这样做,这对中的一个缓冲区总是会在另一个缓冲区之前填满,剩下的空间将永远不会被使用。这个空间是否被标记为在GPU中保留? 像例如,我可以适应4缓冲区包含32MB的数据,但创建64MB的字节宽度到128MB的vram?

回答

1

相同的索引必须与所有顶点缓冲区同时使用。这样做的目的是允许不同的顶点缓冲区包含顶点数据的不同组件。例如,您可能决定将位置存储在一个顶点缓冲区中,并将纹理坐标存储在第二个缓冲区中。第零索引将访问第一个顶点缓冲区的第一个位置和第二个第一个纹理坐标。

如果您想更新每帧的纹理坐标但不改变位置,这将节省带宽。

多个顶点缓冲区也用于实例化。

当您创建顶点或索引缓冲区时,可以指定缓冲区的大小。这些内存然后保留在视频内存中,不能用于任何其他内容。

所以,如果我理解你的问题,不,你不能适应四个64MB缓冲区到128 MB的内存。

+0

好吧,清除的东西,如何获得来自多个缓冲区的每个顶点数据会影响性能呢?如果两个顶点缓冲区都有位置数据会发生什么?我可以得到两者并插入动画等? –

+0

DX10 +中没有固定的流水线,因此完全取决于您(在编写着色器时)您对同一个顶点的两个不同位置所做的操作。通常使用世界矩阵之间的插值来完成动画,而不是在两个顶点缓冲区之间进行插值,但这是另一个话题! – gareththegeek