【问题标题】:Direct3D 10 Hardware Instancing using Structured Buffers使用结构化缓冲区的 Direct3D 10 硬件实例化
【发布时间】:2013-07-31 06:02:04
【问题描述】:

我正在尝试通过 Direct3D 10+ 对每个实例数据使用结构化缓冲区来实现硬件实例化,但我之前没有使用过它们。

我了解在顶点着色器中将每个顶点和每个实例数据组合成单个结构时如何实现实例化 - 即将两个顶点缓冲区绑定到输入汇编器并调用 DrawIndexedInstanced 函数。

在使用带硬件实例化的结构化缓冲区时,谁能告诉我绑定输入汇编程序和进行绘图调用等的过程?我似乎在任何地方都找不到一个很好的例子。

我的理解是,Structured Buffers 被绑定为 ShaderResourceViews,这样对吗?

【问题讨论】:

    标签: directx direct3d directx-11 directx-10 sharpdx


    【解决方案1】:

    是的,完全正确。只是不要将任何每个实例的顶点属性放在顶点缓冲区或输入布局中,并创建缓冲区的 ShaderResourceView 并将其设置在顶点着色器上。然后,您可以使用 SV_InstanceID 语义来查询您所在的实例并从缓冲区中获取相关结构。

    StructuredBuffers 与普通缓冲区非常相似。唯一的区别是您在创建时指定 D3D11_RESOURCE_MISC_BUFFER_STRUCTURED 标志,填写 StructureByteStride,当您创建 ShaderResourceView 时,格式为 DXGI_UNKNOWN(格式由着色器中的结构隐式指定)。

    StructuredBuffer<MyStruct> myInstanceData : register(t0);
    

    是 HLSL 中 StructuredBuffer 的语法,您只需像访问数组一样使用 [] 运算符访问它。

    还有什么不清楚的地方吗?

    【讨论】:

    • 非常感谢,这很有帮助。在 DrawIndexedInstanced MSDN 文章中,它指出“实例化需要多个顶点缓冲区:每个顶点数据至少一个,每个实例数据的第二个缓冲区”让我有点困惑。所以我可以调用 DrawIndexedInstanced,只绑定一个与输入汇编器绑定的顶点缓冲区,并确保我的输入映射只使用一个顶点缓冲区?
    • 这是我的理解,是的。如果您不想使用实例化,则不需要每个实例的顶点属性。
    猜你喜欢
    • 2010-12-28
    • 2011-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-17
    相关资源
    最近更新 更多