效果:
圖左:一道金光閃過,瞬間灰飛煙滅
圖右:燃燒效果,先過渡到黃色,然后漸漸過渡到黑色,最后消失殆盡。
這是游戲中常見的效果,各位可以想想自己玩過的游戲。
手頭正在玩的,夢三國手游,死亡的時候就是溶解消失。
代碼有注釋:
Shader "Custom/Dissolve" { Properties { _MainTex("main tex",2D) = ""{} _DissolveTex("dissolve tex",2D) = ""{}//溶解紋理,根據這張圖的R值(也可以是其它通道的值)來做溶解判斷,簡單的說就是利用這張圖的特征來作為溶解的樣式 _DissolveColor("dissolve color",Color) = (0,0,0,1)//溶解顏色 _EdgeColor("edge color",Color) = (0,0,0,1)//邊緣顏色 _DissolveSpeed("dissolve speed",Range(0,5)) = 2//溶解速度 _DissolveFactor1("dissolve factor1",range(0,1)) = 0.7//溶解因子1,大於這個因子就向溶解色過渡 _DissolveFactor2("dissolve factor2",range(0,1)) = 0.9//溶解因子2,大於這個因子就向邊緣色過渡 } SubShader { Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" struct appdata_custom { float4 vertex:POSITION; float4 texcoord:TEXCOORD0; }; struct v2f { float4 pos:POSITION; float2 uv:TEXCOORD0; }; sampler2D _MainTex; float4 _MainTex_ST; sampler2D _DissolveTex; float4 _DissolveColor; float4 _EdgeColor; float _DissolveSpeed; float _DissolveFactor1; float _DissolveFactor2; v2f vert(appdata_custom v) { v2f o; o.pos = mul(UNITY_MATRIX_MVP,v.vertex); o.uv = TRANSFORM_TEX(v.texcoord,_MainTex); return o; } half4 frag(v2f IN):COLOR { half4 c = tex2D(_MainTex,IN.uv); float dissolve_c_r = tex2D(_DissolveTex,IN.uv).r; float factor = saturate(_Time.y*_DissolveSpeed/5); if(factor>dissolve_c_r) { discard; //clip(-1.0); } float rate = factor / dissolve_c_r; if(rate > _DissolveFactor1) { //向溶解色過渡 c.rgb = lerp(c.rgb,_DissolveColor.rgb,rate); if(rate>_DissolveFactor2) { //向邊緣色過渡 c.rgb = lerp(c.rgb, _EdgeColor.rgb,rate); } } return c; } ENDCG } } FallBack "Diffuse" }
clip:如果輸入向量中的任何元素小於0,則丟棄當前像素。
discard:丟棄當前像素,功能同clip
lerp:線性插值,eg:lerp(a,b,f),a*(1-f)+b*f,隨着f增大,a會越來越趨向於b
CG函數,無需記憶,待用到之時再去查閱即可。
- 本文固定鏈接: http://www.shihuanjue.com/?p=290
- 轉載請注明: 喬 2016年01月13日 於 是幻覺 發表