几何着色阶段位于顶点和像素着色阶段之间。当顶点着色器以顶点作为输入数据,几何着色器是以完整的图元(这里指的是三角形)作为输入数据。例如,如果我们绘制三角形列表,那么将在列表中为每个三角形T执行几何着色程序。
注意,每个三角形的三个顶点都被输入到几何着色器中,而几何着色器输出一个完整的图元。其主要用于创建或者是销毁几何体。而且不仅仅可以将输入的图元(这里以三角形为例)作为整个图元输出出去,还可以将输入图元扩展为一个或者多个其它图元。最常用的就是将点作为输入,将其扩展为四边形然后输出。
几何着色器的输出都是以顶点列表的形式来描述。在顶点离开几何着色器之前,顶点坐标必须变换到齐次裁剪空间。换句话说,在经历几何着色阶段之后,输出的图元(用顶点列表描述)描述的是齐次裁剪空间中的图元。
以下通过模板例子来说明其一般格式:
(1) Maxvertexcount(N)描述的是调用几何着色器所能输出的顶点的最大数量N。只要输出的顶点数量不超过N即可。
(2) 几何着色器一般有两个参数:一个输入参数和一个输出参数。输入参数一定为顶点数组,在其之前会指定一个图元类型解释输入到几何着色器的顶点数组说描述的图元类型。图元类型包括:point、line、triangle、lineadj、triangleadj。
(3) Inout表示的是输出的参数,输出参数属于流类型(stream type)对象,存储的是由几何着色器输出的几何体顶点列表。内置Append用于向输出流添加顶点序列,若想扩展输入的图元,也可以用内置Append向输出流添加多出来的顶点。对于特定的直线和三角形图元类型,可以用RestartStrip方法模拟输出直线列表和三角形列表。以下为一个几何着色编程的例子。
SV_PrimitiveID:
当指定uint primID:SV_PrimitiveID时,输入汇编阶段会为每个图元自动生成一个图元ID。当调用draw方法绘制n个图元时,ID号为0到n-1。
当没有几何着色器时,图元ID参数可以添加到像素着色器的参数列表当中,如下:
但是假如有几何着色器 ,就必须定义在几何着色器的参数列表中,即使几何着色器用不到这个ID,也可以将其图元ID写入输出顶点,传给像素着色器阶段供像素着色器编程使用。
也可以在顶点着色器生成一个顶点ID,使用uint vertID:SV_VertexID语义修饰。如下:
这个时候在调用DrawIndexed方法时,顶点ID表示相应的顶点索引值。