幾何着色器的功能是很強大的,我們可以借用幾何着色器的丢棄圖元的特性實作腐蝕效果。我們也可以通過改變圖元進而實作物體的爆破效果。因為幾何着色器是GPU跑的,是以很大的提升了運作效率,進而實作實時的動畫效果也是毫不費力的,下面的例子是采用了150萬個點渲染的一個地形;
先看效果圖(動态圖可能有些卡):
腐蝕效果:
爆破效果:
如果你之前已經看過我寫的實作表面法線可視化,那麼實作這個效果是非常簡單的。
說一下思路,爆破效果的話就是,将輸出的圖元改成三角面片,然後在幾何着色器中實作每個頂點的更改(朝着法線的方 向)。
輸出圖元:
layout(triangle_strip, max_vertices = 3) out;
步驟:
1. 傳入時間參數;
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();