[toc]

# 什么是几何着色器?

如果不启用曲面细分的话,那么几何着色器这个可选择的阶段实际上是位于顶点着色器与像素着色器之间的。顶点着色器以顶点作为输入数据,而几何着色器的输入数据则是完整的图元,例如,如果要绘制三角形列表,则几何着色器实际上将对列表中的每个三角形 T 执行下列操作

1
2
for(UINT i = 0; i < numTriangles; ++i)
OutputPrimitiveList = GeometryShader(T[i].vertexList);

可以注意到,几何着色器以每个三角形的 3 个顶点作为输入,且输出的是对应的图元列表,与顶点着色器不能销毁或创建不同,几何着色器可以将输入的图元拓展为一个或者多个其它类型的图元 DX12 的几何着色器需要先指定几何着色器单次调用所输出的顶点数量最大值 [maxvertexcount(N)] 相关资料显示,输出的标量在 1~20 时,发挥出 GS 的最佳性能 几何着色器是逐几何的,即可能是三角形 / 点 / 线 且输入与输出是可以不同的,如下: 该几何着色器的输入是一个线条,输出是一个三角形带 但其实每个不同的类型想要输出其他类型前需要做一些操作,如想要输出三角形带, 则需要在添加三个顶点进三角形 Out 后 (Append 方法), 再调用 RestartStrip 方法

DX 430 页里有使用几何着色器进行三角形细分的方法