ShaderLab學習小結(十七)草帽團的旗子
阿新 • • 發佈:2018-02-08
sha shade 向上 最小 process pragma n) 通過 shaderlab 目標:弄個草帽團的海盜旗,通過shader讓它有飄揚的效果,因為我要成為海賊王(不是他的男人)
最終效果如下:
其實效果還差的很遠,就大概有這麽個意思吧,好歹讓它先動起來 也就是圖中旗子在x軸方向上的最左側,即x值最小處
經過試驗,這個值應該是 -5,所以我設置的_Edge為 -4.9,那麽只有在x坐標大於這個值的部分,plane才會波動
最終效果如下:
其實效果還差的很遠,就大概有這麽個意思吧,好歹讓它先動起來
旗子用的是plane,不要用cube,這是基於頂點計算的,cube算來算去只有八個頂點,根本飄不起來
而且我們把plane繞x軸轉90度把它立起來
所以它本身的坐標是:
x軸水平向右,z軸垂直向下,y軸垂直向裏
shader代碼:
//1. Shader "Custom/SKFlag" { Properties{ _MainTex("Main",2D)=""{} _A("A",range(0.1,3))=1 _F("F",range(0.1,2))=1 _Edge("Edge",range(-10,10))=0 _TimeScale("TimeScale",range(0,20))=2 } SubShader { pass{ cull off //2. CGPROGRAM #pragma vertex vert #pragma fragment frag #include "unitycg.cginc" #include "lighting.cginc" sampler2D _MainTex; float4 _MainTex_ST; float _A; float _F; float _TimeScale; float _Edge; struct v2f{ float4 pos:POSITION; float2 uv:TEXCOORD0; }; v2f vert(appdata_base v) { v2f o; o.pos=v.vertex; if(o.pos.x>_Edge) //3. { o.pos.y+=_A*0.8*sin(_F*(o.pos.x+o.pos.z)+_Time.y*_TimeScale*0.6); //4. o.pos.z+=_A*0.3*sin(_F*(o.pos.x+o.pos.y)+_Time.y*_TimeScale*0.6); //5. } if(o.pos.x>-1) { o.pos.y+=_A*0.3*sin(_F*(o.pos.x+o.pos.z)+_Time.y*_TimeScale*0.8); } if(o.pos.x>1) { o.pos.y+=_A*0.8*sin(_F*(o.pos.x+o.pos.z)+_Time.y*_TimeScale*0.8); o.pos.x+=_A*0.2*sin(_F*(o.pos.z+o.pos.y)+_Time.y*_TimeScale*0.3); } if(o.pos.x>3) { o.pos.y+=_A*0.8*sin(_F*(o.pos.x+o.pos.z)+_Time.y*_TimeScale*0.2); } o.pos=mul(UNITY_MATRIX_MVP,o.pos); o.uv=TRANSFORM_TEX(v.texcoord,_MainTex); return o; } fixed4 frag(v2f IN):COLOR { fixed4 col=tex2D(_MainTex,IN.uv); return col; } ENDCG } } }
先看一個函數:f(x)=Asin(ωx+φ)
A:振幅,函數最大值為A,最小值為-A;ω:角頻率 ;φ:初相,即x=0時的相位ωx+φ
再看我們的代碼
1
定義的屬性中有主材質,放海盜旗的圖
_A:振幅
_F:角頻率
_TimeScale:時間函數乘上的系數
_Edge:這個是x方向坐標的邊界後面說明
2
cull off
默認是剔除背面
cull back
也就是plane只能看到一面,而看不到另一面的原因,改成cull off,不剔除背面,則兩面都是旗子
3
這裏是第一個判斷處
if(o.pos.x>_Edge) //3.
縱觀整個代碼,旗子在三個方向都會有波動,但是,如果旗子是插在旗桿上的話,那與旗桿的連接處是不應該有波動的
經過試驗,這個值應該是 -5,所以我設置的_Edge為 -4.9,那麽只有在x坐標大於這個值的部分,plane才會波動
4、5
這些,還有下面的那些就是讓plane產生波動的計算了
_A是波動(飄揚)的最大幅度,_Time是時間向量,好像也是四維的,xyzw
_Time.y*_TimeScale
這個可以看作是波動的頻率快慢吧
調整_TimeScale的值越大,波動的越快
而_F*(...)呢,我的理解是影響波長,_F越大,波長越小,同一時間旗子上的波峰波谷越多,反之越少
不知道理解的正不正確,反正出來的效果差不多是這樣
ShaderLab學習小結(十七)草帽團的旗子