我正在编写一个带有静态和动画(包括骨骼动画)网格的 3D 图形应用程序(使用 SharpDX)。有些网格每帧只会渲染一次,有些会被渲染很多次。为了加快渲染速度,我计划利用硬件实例化。
我没有实现实例化和非实例化渲染例程并为每个网格选择正确的渲染例程,而是想到简单地对所有网格使用实例化渲染会更容易。
假设目标硬件支持硬件实例化,使用硬件实例化绘制所有网格是否有任何缺点,即使它们每帧只出现一次?
我正在编写一个带有静态和动画(包括骨骼动画)网格的 3D 图形应用程序(使用 SharpDX)。有些网格每帧只会渲染一次,有些会被渲染很多次。为了加快渲染速度,我计划利用硬件实例化。
我没有实现实例化和非实例化渲染例程并为每个网格选择正确的渲染例程,而是想到简单地对所有网格使用实例化渲染会更容易。
假设目标硬件支持硬件实例化,使用硬件实例化绘制所有网格是否有任何缺点,即使它们每帧只出现一次?
在执行此操作时,您将为输入汇编器做更多的工作,但只是对实例/非实例的高分辨率球体和时间戳进行了快速测试,我得到了几乎相同的结果。
请注意,我在实例版本中使用了结构化缓冲区(进行了一些查找以取代)。
另外,由于您提到您将使用蒙皮,因此在您的情况下,潜在成本将大大降低(因为您的顶点着色器必须做很多工作)。
为避免根据您的评论添加到着色器结构中,您还可以使用 StructuredBuffers 并使用 SV_InstanceID 或 SV_VertexID 进行查找,这比每个实例顶点缓冲区灵活得多(知道您还可以稍后抵消 Compute Shaders 中的一些工作舞台更容易)。
我认为它可能会慢一点,因为您正在引入额外的缓冲区绑定来设置实例缓冲区。所以每个网格需要 2-3 个缓冲区来渲染(顶点缓冲区、实例缓冲区和可能的索引缓冲区),而不仅仅是 1-2 个(vb 和 ib)。
与往常一样,如果它有助于标准化您的引擎并且您没有遇到任何明显的缺点,那么就没有必要进行优化。唯一知道的方法是分析您的应用程序的这两个变体。