“单一实例”的硬件实例化的缺点

时间:2013-06-30 21:18:48

标签: graphics 3d directx hardware-acceleration sharpdx

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

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

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

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

另外,既然你提到你将使用皮肤,你的情况下潜在的成本会被最小化(因为你的顶点着色器必须做很多工作)。

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