Shader學習筆記_Vertex Shader_幾何變換_波
阿新 • • 發佈:2018-11-09
這篇文章是根據某Unity教學網站的shader教程來寫的筆記。
由於本人技術水平方面的欠缺可能會有各種各樣嚴重的錯誤,沒有任何參考價值,歡迎各位大佬指正。
本次由於是根據之前的課程中途開始寫的筆記,所以是在先貼出基本的頂點和片段程式碼塊,和操作步驟。
先在Unity中建立Material,shader各一個, 隨你命名什麼 之後在場景中建立一個plane
在shader中新增如下程式碼
還是簡要說一下,Unity一共有三種形態, 固定管線 Shader, vertex和fragment shader和SubFace shaderShader "Custom/Wave" { SubShader { pass{ CGPROGRAM #pragma vertex vert #pragma fragment frag #include "unitycg.cginc" struct v2f { float4 pos:POSITION; float4 col:Color; }; v2f vert(appdata_base v) { v2f o; o.pos = mul(UNITY_MATRIX_MVP,v.vertex); <span style="white-space:pre"> </span>o.col= fixed4(0,1,1,1); return o; } fixed4 frag(v2f IN):COLOR { return IN.col; } ENDCG } } }
對於固定管線Shader,據說已經在unity5.1中已經完全移除,目前所針對的是頂點和片段shader
一般來說頂點函式用於處理頂點位置,大小,片段函式用於處理畫素
目標:頂點和片段shader水波變換
首先在vert函式中加入
v.vertex.y += sin(_Time.y + _Time.y);
綁上物體後可以看到物體頂點開始上下的移動...這是因為上述程式碼是對所有頂點進行上下運動。
_Time是Cg語言中的內建函式 下表可以看到是float4型別 x,y,z,w分別對應如下,下面的t是時間
之後再更改如下
<span style="white-space:pre"> </span>v.vertex.y += sin(v.vertex.x + _Time.y);
可以看到plane會沿著 x方向波動,有了似乎是旗幟的效果。
這時可以試著自由更改v.vertex.x為v.vertex.z可以發現會沿z來運動,這時把引數進行乘除法會相應減少波動振幅
咳咳,這似乎好像是一個高中數學叫正弦波的概念……我不太瞭解。
額,看來得看看數學了
然後再試著更改顏色
o.col= fixed4(v.vertex.y,v.vertex.y,v.vertex.y,1);
由於之前是根據頂點來變換的,所以顏色引數更改為頂點會隨著波動上下來變色,會出現一點所謂偽光線的效果
但是這個效果仍然不是很好…
據老師說在04年那本CG語言裡提出了用4個正弦波才能模仿出比較好的湖面效果
由於機能限制,我們可以先用兩個正選波,可以把相應行改為
v.vertex.y += 0.2 * sin((v.vertex.x + v.vertex.z) + _Time.y);
v.vertex.y += 0.3 * sin((v.vertex.x - v.vertex.z) + _Time.w);
可以看到一個斜著的水面效果.
小提示!
如果你嘗試更改為
<pre name="code" class="plain">v.vertex.y += sin(length(v.vertex.xz)*2 + _Time.w);
會看到一個很噁心的從原心波動的效果! 根據這個自由擴充套件吧!
這是我的第一次在CSDN上寫部落格,之後我會盡量把學習的東西都搬上CSDN上,請大家多多關照。