简介
几何着色器(Geometry Shader)是一个可选功能,他介于在顶点和片段着色器之间,接收一组顶点数据,可以对数据进行处理,而且可以根据数据生成不止一个图形,假如你想绘制四个顶点,按照以前的方式,需要for循环四次,每次都顶点数据进行处理,最后传入顶点着色器中。而集合着色器就做了这样一件事。在移动平台上,几何着色器需要OpenGL ES 3.2版本(android 7之上),同样的我们可以先参考文档或其他相关资料学习3.0新特性。
3.0变化
这里简单学习一下3.0和2.0比较重要的变化
-
attribute和varying,取而代之的是 in和out
-
文件需要添加#version 300 es (如果是3.2则是320,不加则默认2.0)
-
还有纹理 texture2D和texture3D统统改为 texture
-
内置函数gl_FragColor和gl_FragData删除,如果片段着色器要输出用out声明字段输出。不过保留了gl_Position
-
还有的是layout的作用:可以直接指定位置
// opengl 2.0
uniform float intensity;
// 代码 赋值
GLES20.glUniform1f(GLES20.glGetAttribLocation(program,
"intensity"), 1f)
//opengl 3.0
layout (location = 1) uniform float intensity;
//直接写上对应的layout的值就可以赋值
GLES30.glUniform1f(1,1f)
几何着色器
绘制点
先看一个几何着色器的例子:
#version 320 es
layout (points) in; // 输入
layout (points, max_vertices = 4) out; //输出
in VS_OUT {
vec3 color;
} gs_in[];
out vec3 fColor;
void build_point(vec4 position);
void main() {
build_point(gl_in[0].gl_Position);
}
void build_point(vec4 position){
fColor = gs_in[0].color;
gl_Position = position + vec4(-0.5, 0.5, 0.0, 0.0);// 1:左上角
gl_PointSize = 20.0;
EmitVertex();
gl_Position = position + vec4(0.5, 0.5, 0.0, 0.0);// 2:右上角
EmitVertex();
gl_Position = position + vec4(-0.5, -0.5, 0.0, 0.0);// 3:左下角
gl_PointSize = 10.0;
EmitVertex();
gl_Position = position + vec4(0.5, -0.5, 0.0, 0.0);// 4:右下角
fColor = vec3(1.0, 1.0, 1.0);
EmitVertex();
EndPrimitive();
}
这个几何着色器的作用是:输入一个顶点的数据,输出四个顶点显示在屏幕上;前两个点大小为20,后两个点大小为10