1

假设我为两个不同的网格创建了两个顶点缓冲区。

     (I'm assuming creating separate buffers for separate meshes is how it's usually done)

现在,假设我想使用索引缓冲区绘制其中一个网格。看这本书Practical Rendering and Computation with Direct3D 11它似乎并不像索引缓冲区的创建以任何方式引用顶点缓冲区,那么索引缓冲区如何知道(在输入组装期间)要作用的顶点缓冲区?

我做了一些没有答案的谷歌搜索,这让我假设我缺少一些明显的东西。

4

2 回答 2

2

你是对的,索引缓冲区不引用特定的顶点缓冲区。在DrawIndexed活动索引缓冲区用于向活动顶点缓冲区(您使用 SetIndexBuffer/SetVertexBuffers 设置的缓冲区)提供索引。

于 2017-02-14T17:37:12.947 回答
1

事实上,索引缓冲区和顶点缓冲区是完全独立的。

索引缓冲区将在绘制时知道 VertexBuffer(例如:当两者都绑定到管道时)

您可以将索引缓冲区视为“查找表”,您可以在其中保留要绘制的列表或元素索引。

这也意味着您可以将两个完全“逻辑上不相关”的缓冲区附加到管道并绘制它,没有什么可以阻止您这样做,但是您当然会得到一些奇怪的视觉结果。

解耦两者有很多优点,这里有几个例子:

  • 您可以重复使用索引缓冲区(例如,具有相同分辨率的两个移位网格可以共享相同的索引缓冲区)。这可能是一个不错的记忆增益。
  • 您可以自己绘制顶点缓冲区并对每个顶点进行一些处理(例如,为精灵绘制一个点列表,或者将蒙皮/置换应用到流输出缓冲区中,然后使用 DrawIndexed 绘制生成的顶点缓冲区)
  • 两个顶点/索引缓冲区也可以绑定为 ByteAddressBuffer,因此您还可以在 Compute Shader 中处理您的几何图形,并构建另一个优化的索引缓冲区,例如剔除三角形,然后使用优化的缓冲区处理索引绘制。使用索引而不是顶点应用这些剔除通常比顶点更快,因为您将移动更少的内存。
  • 这是一个小众案例,但有时我必须将网格绘制为一组三角形,然后绘制为一组线(某种形式的线框)。例如,如果您使用一个 Box,您将不想将对角线绘制为线,因此我有一个共享的 Vertexbuffer 与框顶点,然后一个 IndexBuffer 专用于绘制三角形列表,另一个用于绘制线列表。在大型模型的情况下,这也可以是有效的内存增益。
于 2017-02-23T14:56:23.493 回答