我正在编写一个具有静态和动画(包括骨架动画)网格的3D图形应用程序(使用SharpDX)。有些网格每帧只渲染一次,有些则渲染很多次。为了加快渲染速度,我计划利用硬件实例化的优势。
与实现实例化和非实例化渲染例程并为每个网格选择正确的例程相比,我想到了简单地对所有网格使用实例化渲染会更容易。
假设目标硬件支持硬件实例化,使用硬件实例化绘制所有网格是否有任何缺点,即使它们每帧只出现一次?
发布于 2013-07-09 17:41:06
我认为它可能会稍微慢一点,因为你引入了一个额外的缓冲区绑定来设置实例缓冲区。因此,每个网格需要渲染2-3个缓冲区(顶点缓冲区、实例缓冲区和可能的索引缓冲区),而不是只需要1-2 (vb和ib)。
像往常一样,如果它有助于标准化你的引擎,并且你没有遇到任何明显的缺点,那么就没有必要进行优化。唯一知道的方法是分析你的应用程序的这两个变体。
发布于 2013-07-09 20:15:55
在这样做的同时,你会给你的输入汇编器多一点工作,但只是用高分辨率的球体和实例化/非实例化的时间戳做了一个快速测试,我得到了几乎相同的结果。
请注意,我在实例化版本中使用了一个结构化的缓冲区(做了一些查找来替换)。
此外,由于您提到您将使用蒙皮,在您的情况下,潜在的成本将最小化很多(因为您的顶点着色器将不得不做相当多的工作)。
为了避免根据您的注释添加到着色器结构,您也可以使用StructuredBuffers并使用SV_InstanceID或SV_VertexID进行查找,这比每个实例顶点缓冲区更灵活(知道您也可以在稍后阶段更容易地抵消计算着色器中的一些工作)。
https://stackoverflow.com/questions/17394941
复制相似问题