在DirectX 11中使用索引缓冲区;怎么知道的?

时间:2017-02-14 17:05:15

标签: c++ directx directx-11 index-buffer

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

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

现在,假设我想使用索引缓冲区绘制其中一个网格。 看看使用Direct3D 11进行实际渲染和计算这看起来似乎没有以任何方式创建索引缓冲区引用顶点缓冲区,那么索引缓冲区如何知道(在输入汇编期间)什么顶点缓冲行动?

我做了一些谷歌搜索没有答案,这让我认为有一些明显的东西,我错过了。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

实际上,Index Buffers和Vertex Buffers是完全独立的。

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

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

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

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

  • 您可以重复使用索引缓冲区(例如,具有相同分辨率的两个移位网格可以共享相同的索引缓冲区)。这可能是一个不错的记忆收益。
  • 您可以在它上面绘制Vertex缓冲区并对每个顶点进行一些处理(例如,绘制精灵的点列表,或者将蒙皮/位移应用到Stream Output缓冲区,然后使用生成的顶点缓冲区绘制DrawIndexed)
  • Vertex / Index缓冲区也可以绑定为ByteAddressBuffer,因此您还可以在Compute Shader中处理几何体,并构建另一个优化的索引缓冲区,例如使用剔除三角形,然后使用优化缓冲区处理Indexed Draw。将这些剔除应用于索引而不是顶点通常比顶点更快,因为你将移动更少的内存。
  • 这是一个利基案例,但有时候我必须将网格绘制为一组三角形,然后绘制为一组线条(某种形式的线框)。例如,如果您选择一个Box,则不希望将对角线绘制为线条,因此我有一个带顶点的共享Vertexbuffer,然后一个专用于绘制三角形列表的IndexBuffer,另一个用于绘制线列表。对于大型模型,这也可以是有效的内存增益。