几何着色器可以将图元转换为其他图元,这是细分阶段无法做到的。例如,三角形网格可以通过每个三角形创建线条边缘来转换为线框视图。或者,线条可以被面向观众的四边形替换,从而使线框渲染具有更粗的边缘[1492]。几何着色器在2006年底DirectX 10发布时被添加到硬件加速图形管道中。它位于管线中的细分着色器之后,使用是可选的。虽然它是Shader Model 4.0的必要部分,但在早期的Shader Model中并未使用。OpenGL 3.2和OpenGL ES 3.2也支持这种类型的着色器。
几何着色器的输入是单个对象及其关联的顶点。该对象通常由三角形条带、线段或简单的点组成。可以通过几何着色器定义和处理扩展图元。特别地,可以传入三角形外的三个额外顶点,并且可以使用折线上的两个相邻顶点。参见图3.12。使用DirectX 11和Shader Model 5.0,您可以传入更复杂的patch,最多可达32个控制点。也就是说,曲面细分阶段对于patch生成更有效[175]。
几何着色器处理这个图元并输出零个或多个顶点,这些顶点被视为点、折线或三角形条带。请注意,几何着色器可以不生成任何输出。通过这种方式,可以通过编辑顶点、添加新图元和删除其他图元来选择性地修改网格。
几何着色器旨在修改传入数据或制作有限数量的副本。例如,一种用途是生成六个变换后的数据副本,以同时渲染立方体贴图的六个面;参见第10.4.3节。它还可以用于高效创建级联阴影贴图,以生成高质量阴影。利用几何着色器的其他算法包括从点数据创建可变大小的粒子、沿轮廓挤出鳍状物以进行皮毛渲染以及查找阴影算法的对象边缘。参见图3.13了解更多示例。这些和其他用途将在本书的其余部分中讨论。