《OGL dev》Etay Meiri Tutorial 27 - Billboarding and the Geometry Shader 笔记
Geometry Shader,几何渲染器,简称GS,是DirectX10引入的shader,OpenGL 3.2开始支持。
geometry shader位于vertex shader之后,裁剪之前。geometry shader是可选的。
每次draw call调用,geometry shader接收一个由draw call参数决定的拓扑类型的图元,输出0个、1个或多个图元,图元的拓扑类型可以是顶点列表、line strip和triangle strip其中之一。
- 其中,输出0个、1个或多个图元的能力称为growing geometry(几何增长)。
Triangle strips类型的图元,前3个顶点构成一个三角形,之后每一个新增的顶点与之前两个顶点构成一个三角形。对顶点进行编号,构成三角形的顶点顺序为[0,1,2]、[1,3,2]、[2,3,4]、[3,5,4]...,如下图所示:
geometry shader常用于实现billboarding(广告牌)技术。billboard是一个quad,由2个三角形,4个顶点组成,它的法线总是指向摄影机,并随摄影机转动。因为billboard总是朝向摄影机,玩家会误以为它是完整的模型。billboard常用于创建森林。
layout (points) in;
layout (triangle_strip) out;
layout (max_vertices = 4) out;
声明GS的输入拓扑为点列表,输出拓扑为triangle strip,emit的最大顶点数为4。
- emit的最大顶点数指,一次GS调用输出的最大顶点数。这为图形驱动提供优化GS的机会。
每次GS调用,在GS中通过内置变量'gl_in[0]'访问输入图元的第一个顶点,同理'gl_in[1]'和'gl_in[2]'访问图元的第二和第三个顶点,前提是输入的图元存在那么多顶点可以访问。
在GS中,每次调用EmitVertex();
输出图元的一个顶点,当所有顶点都输出完毕之后,必须调用EndPrimitive();
表示图元输出完毕。
在fragment shader中,调用discard;
可以丢弃当前的片元。