天天看點

幾何着色器(三)爆破和腐蝕效果

幾何着色器的功能是很強大的,我們可以借用幾何着色器的丢棄圖元的特性實作腐蝕效果。我們也可以通過改變圖元進而實作物體的爆破效果。因為幾何着色器是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();
           

繼續閱讀