Graphics “硬件实例”的缺点;“单一实例”;

Graphics “硬件实例”的缺点;“单一实例”;,graphics,3d,directx,hardware-acceleration,sharpdx,Graphics,3d,Directx,Hardware Acceleration,Sharpdx,我正在编写一个带有静态和动画(包括骨骼动画)网格的3D图形应用程序(使用SharpDX)。有些网格每帧仅渲染一次,有些网格将渲染多次。为了加快渲染速度,我计划利用硬件实例 与其实现实例化和非实例化渲染例程并为每个网格选择正确的渲染例程,不如简单地为所有网格使用实例化渲染 假设目标硬件支持硬件实例化,使用硬件实例化来绘制所有网格是否有任何缺点,即使它们每帧只出现一次?我认为这可能会稍微慢一点,因为您正在引入一个额外的缓冲区绑定来设置实例缓冲区。因此,每个网格需要渲染2-3个缓冲区(顶点缓冲区、实例

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

与其实现实例化和非实例化渲染例程并为每个网格选择正确的渲染例程,不如简单地为所有网格使用实例化渲染


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

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


一如既往,如果它有助于标准化您的发动机,并且您没有遇到任何明显的缺点,那么就没有必要进行优化。唯一知道的方法是分析你的应用程序的这两个变体。

你会给你的输入汇编程序多做一点工作,但只是对实例/非实例的高分辨率球体和时间戳进行了快速测试,我得到了几乎相同的结果

请注意,我在实例化版本中使用的是结构化缓冲区(执行一些查找以替换)

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


为了避免根据您的注释添加到着色器结构,您还可以使用StructuredBuffers并使用SV_InstanceID或SV_VertexID进行查找,这比每个实例顶点缓冲区灵活得多(知道您还可以更轻松地在后期抵消计算着色器中的一些工作).

我遇到的另一个缺点是,每对象常量不再存在于常量缓冲区中,而是添加到着色器结构中。如果像素着色器需要常量,则它们必须通过光栅化器等。感谢有关StructuredBuffers的提示,我以前从未见过这种技术。我会调查的!