我有一个非常昂贵的顶点着色器,因此我想最小化渲染的多边形数量。
我可以在cpu上进行合理数量的剔除,但它不会下降到每个多边形或每个顶点级别,这是我想要的。我的目标是表现。
有没有快速的技术来做到这一点?
编辑:我知道顶点着色器可以改变顶点的位置,但这不是顶点着色器昂贵的原因。因此,我可以在某个管道中计算顶点的位置位置,然后在可能的情况下计算剩余的每个顶点。
答案 0 :(得分:2)
这取决于您的具体情况。如果您可以相对容易地(或多或少)从前到后渲染,并且通常情况下隐藏整个对象,OpenGL遮挡查询可能是一个非常有用的工具。
遮挡查询背后的想法是,您使用非常简单的着色器渲染几何体,并获得一个结果,告诉您它是否导致任何可见渲染。然后,如果它生成了可见像素,则实际上使用完整着色器渲染它。如果查询结果告诉您它已完全隐藏,则跳过渲染。使用简化几何结构也是常见的,例如一个边界框,在提交遮挡查询的绘图命令时。
有效使用遮挡查询可能有些棘手,因为您必须等到GPU完成查询才能回读结果。如果您不是非常小心,这可能会在CPU和GPU之间产生不希望的同步。有一种叫做"条件渲染的新方法"这避免了这一点。这里的想法是你总是提交完整的绘图命令,但是告诉GPU根据查询结果跳过它们。与遮挡查询相比,缺点是您总是需要CPU开销来提交绘图命令。但是根据用例,这仍然比处理传统遮挡查询可能发生的同步和可能的停顿要好得多。
如果你不能轻易地从前到后渲染,你也可以考虑采用双通法。您可以使用非常简单的着色器渲染所有几何体,同时仅写入深度缓冲区(禁用颜色写入)。然后为所有对象提交遮挡查询,并根据查询结果使用完整着色器渲染可见对象。
答案 1 :(得分:1)
您无法在顶点着色器中执行任何基本操作,因为您一次只能获得一个顶点。但是,如果您正在使用DirectX 11,则通常可以将大量昂贵的每个顶点计算移动到细分阶段。即使你没有做任何细分也是如此。这样做的好处是,在对顶点进行昂贵的计算之前,您可以在细分阶段中剔除背面三角形。有关如何执行此操作的详细信息,请搜索tesselation背面剔除。作为奖励,你甚至可以做三角锥体剔除。
使用计算着色器或在CPU上执行此方法更快更容易。
答案 2 :(得分:-1)
在您的上下文中,我将继续添加计算着色器。
着色器将读取三角形列表作为索引的缓冲区,从映射为StructuredBuffer的顶点缓冲区中检索执行转换所需的位置和其他值。然后,如果剔除声称可见三角形,则将三个索引输出到最终索引缓冲区,并在小缓冲区中将索引计数加三。最后,您将能够使用DrawIndexedInstancedIndirect
使用正确的索引量渲染剔除的几何体。