我试图对图形管线有一个高层次的理解。有一件事情让我感到困惑,那就是为什么 Geometry Shader 存在。对我来说,Tessellation 和 Geometry Shader 似乎做的是同样的事情。有人能向我解释一下,Geometry Shader 和 Tessellation Shader 之间有什么不同,以证明它的存在是有意义的吗?
tessellation着色器用于可变细分。重要的部分是邻接信息,以便您可以正确地进行平滑处理,不会产生间隙。您可以使用几何着色器进行一些有限的细分,但这并不是它的主要用途。
几何着色器按原始图元操作。例如,如果您需要为每个三角形执行某些操作(例如此),请在几何着色器中执行。我听说过阴影体积挤出也可以在其中完成。还有“保守光栅化”,在其中您可能会扩展三角形边界,以便每个相交的像素都获得片段。这些示例非常特定于应用程序。
是的,它们也可以生成比输入更多的几何图形,但它们不会很好地扩展。如果要绘制粒子并将点转换为非常简单的几何图形,则它们非常有效。我也使用几何着色器多次实现了 marching cubes。与变换反馈结合使用,可保存生成的网格。
变换反馈还与几何着色器一起用于执行更多计算操作。一个特别有用的机制是它为您执行流压缩(紧密将其各种数量的输出打包,以便结果数组中没有间隙)。
几何着色器提供的另一个非常重要的功能是路由到分层渲染目标(纹理数组,立方体的面,多个视口),这是必须按原始图元进行的。例如,您可以通过将几何形状复制并投影6次到每个立方体面来在单个通道中为点光源渲染立方体阴影图。
虽然不完整,但希望这能够传达出它们之间的差异。
参见: