几何着色器的功能是很强大的,我们可以借用几何着色器的丢弃图元的特性实现腐蚀效果。我们也可以通过改变图元从而实现物体的爆破效果。因为几何着色器是GPU跑的,所以很大的提升了运行效率,从而实现实时的动画效果也是毫不费力的,下面的例子是采用了150万个点渲染的一个地形;
先看效果图(动态图可能有些卡):
腐蚀效果:
爆破效果:
如果你之前已经看过我写的实现表面法线可视化,那么实现这个效果是非常简单的。
说一下思路,爆破效果的话就是,将输出的图元改成三角面片,然后在几何着色器中实现每个顶点的更改(朝着法线的方 向)。
输出图元:
layout(triangle_strip, max_vertices = 3) out;
步骤:
1. 传入时间参数;
uniform float time;
2.获得法线
法线可以从程序中直接读取也可以在几何着色器中计算
vec3 getNormal(vec4 pos0, vec4 pos1, vec4 pos2)
{
vec3 a = vec3(pos0) - vec3(pos1);
vec3 b = vec3(pos2) - vec3(pos1);
return normalize(cross(a, b));
}
vec3 normal = getNormal(gl_in[0].gl_Position,gl_in[1].gl_Position,gl_in[2].gl_Position);
3.更新三角面片顶点
int i = 0;
for( i =0; i< gl_in.length(); i++){
float d = dist(time);// dist函数实现计算根据时间计算偏移量,自己定义即可
gl_Position = gl_in[i].gl_Position+vec4(normal,1)*d;
EmitVertex();
}
}
EndPrimitive();