【问题标题】:Drawbacks of Hardware Instancing for "single instances"“单实例”的硬件实例化的缺点
【发布时间】:2013-06-30 21:18:48
【问题描述】:

我正在编写一个带有静态和动画(包括骨骼动画)网格的 3D 图形应用程序(使用 SharpDX)。有些网格每帧只会渲染一次,有些会被渲染很多次。为了加快渲染速度,我计划利用硬件实例化。

我没有实现实例化和非实例化渲染例程并为每个网格选择正确的渲染例程,而是想到简单地对所有网格使用实例化渲染会更容易。

假设目标硬件支持硬件实例化,使用硬件实例化绘制所有网格是否有任何缺点,即使它们每帧只出现一次?

【问题讨论】:

    标签: graphics 3d directx hardware-acceleration sharpdx


    【解决方案1】:

    在执行此操作时,您将给输入汇编器做更多的工作,但只是对实例化/非实例化的高分辨率球体和时间戳进行了快速测试,我得到了几乎相同的结果。

    请注意,我在实例版本中使用了结构化缓冲区(进行了一些查找以取代)。

    此外,由于您提到您将使用蒙皮,因此在您的情况下,潜在成本将大大降低(因为您的顶点着色器必须做很多工作)。

    为避免根据您的评论添加到着色器结构中,您还可以使用 StructuredBuffers 并使用 SV_InstanceID 或 SV_VertexID 进行查找,这比每个实例顶点缓冲区灵活得多(知道您还可以抵消 Compute Shaders 中的一些工作在以后的阶段更容易)。

    【讨论】:

    • 感谢有关 StructuredBuffers 的提示,我以前没有遇到过这种技术。我会调查的!
    【解决方案2】:

    我认为它可能会慢一点,因为您正在引入额外的缓冲区绑定来设置实例缓冲区。所以每个网格需要渲染 2-3 个缓冲区(顶点缓冲区、实例缓冲区和可能的索引缓冲区),而不是只有 1-2 个(vb 和 ib)。

    与往常一样,如果它有助于标准化您的引擎并且您没有遇到任何明显的缺点,那么就没有必要进行优化。了解的唯一方法是分析您的应用的这两个变体。

    【讨论】:

    • 我遇到的另一个缺点是每个对象的常量不再存在于常量缓冲区中,而是添加到着色器结构中。如果像素着色器需要常量,则必须通过光栅器等传递。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-10
    • 2016-07-13
    • 1970-01-01
    • 1970-01-01
    • 2011-01-13
    • 1970-01-01
    相关资源
    最近更新 更多