几何着色器
什么是几何着色器?
- 几何着色器是顶点着色器与片段着色器之间的一种可选着色器,他的输入是一个图元的一组顶点,输出是另一个图元的一组顶点
为什么要用几何着色器?
- 由于几何着色器可以在顶点发送到下一着色阶段之前对他们随意变换,所以他的作用就是将一个图元变换为另一个完全不同的图元,或者修改图元的位置
怎么使用几何着色器?
- 在几何着色器的顶部,声明从顶点着色器输入的图元类型:layout (primitive) in;
- 可以输入的图元有5类:points,lines,lines_adjacency,triangles,triangles_adjacency
- 指定几何着色器的输出图元类型:layout (primitive, max_vertices = n) out;
- 输出图元有三种选项:points,line_strip,triangle_strip
- 几何着色器还要设置一个他的最大输出顶点数量,如果绘制时超过了这个值,OpenGL将不会绘制多出的顶点
- 为了方便使用顶点着色器传入的数据,glsl提供了内置变量gl_Vertex
in gl_Vertex
{
vec4 gl_Position;
float gl_PointSize;
float gl_ClipDistance[];
} gl_in[];
- 调用EmitVertex()后,gl_Position中的数据会被添加到输出的图元中
- 调用EndPrimitive()后,所有发射出的顶点会合成指定输出的图元
- 重复调用EndPrimitive()能够生成多个图元
一个栗子
银角大王的小葫芦:”收“
-
这个效果很简单,在几何着色器中,将模型的三角面都按照一个固定的方向,随着时间移动即可
-
需要注意的地方:几何着色器中使用的gl_in[i].gl_Position是顶点着色器传进来的,这个位置是裁剪空间坐标,所以在使用gl_in[i].gl_Position与其他顶点属性数据或者其他向量运算时,应该保证他们都是裁剪空间中的坐标
-
将法线变换到裁剪空间的方法:先用法线左乘发现法线矩阵,然后再左乘视图矩阵和投影矩阵;法线矩阵还是模型矩阵的逆矩阵的转置(不要忘了去掉模型矩阵中的平移部分)
-
所以总结一下就是:在写shader时,看shader中运算时用的是哪个空间中的坐标系,然后将用到的数据都变换到相应的坐标系下再运算