標籤:技巧 著色器 lan style article 利用 appdata mil sla
效果
原理
根據給定的雜訊圖,當雜訊圖中的R值小於指定的值,就捨棄當前的像素。
1. 雜訊圖
雜訊在圖形學內十分常見,可以認為是圖形學裡的隨機數(這裡我們不用真的隨機數,是因為真的隨機數太過“均勻”,形成的是白色雜訊,一點都不好用)。
2. 著色器
(註:完整代碼在最後貼出。)
屬性定義如下:
(1) Main Tex:物體的主要紋理貼圖,決定了物體的主要外表
(2) Noise Tex:雜訊貼圖
(3) Min Alpha:最低的Alpha,當雜訊貼圖中的R值小於該值,則捨棄當前的像素
頂點著色器:只是傳入位置和貼圖座標,十分簡單,這裡就不贅述了。
片元著色器:
當雜訊貼圖小於最低的Alpha,捨棄當前像素
float4 frag(v2f input) : SV_Target {
float4 mainColor = tex2D(_MainTex, input.texcoord); float4 noiseColor = tex2D(_Noise, input.texcoord); float alpha = noiseColor - _MinAlpha; clip(alpha); return mainColor; }
上面只是實現了消失的效果,為了有火燒的效果,可以在消失的邊緣處改用黃色。
float4 frag(v2f input) : SV_Target {
float4 mainColor = tex2D(_MainTex, input.texcoord); float4 noiseColor = tex2D(_Noise, input.texcoord); float alpha = noiseColor - _MinAlpha; clip(alpha); if(alpha < 0.05) return float4(1,0.5,0,0) * alpha / 0.05; else return mainColor; }
完整的Shader代碼:
Shader "Custom/Melt" { Properties { _MainTex("Main Tex", 2D) = "white" {} _Noise("Noise Tex", 2D) = "white" {} _MinAlpha("Min Alpha", Range(0, 1)) = 0.0 } SubShader { Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" sampler2D _Noise; sampler2D _MainTex; float _MinAlpha; struct appdata { float4 vertex : POSITION; float2 texcoord : TEXCOORD0; }; struct v2f { float4 position : SV_POSITION; float2 texcoord : TEXCOORD1; }; v2f vert(appdata input) { v2f o; o.position = mul(UNITY_MATRIX_MVP, input.vertex); o.texcoord = input.texcoord; return o; } float4 frag(v2f input) : SV_Target { float4 mainColor = tex2D(_MainTex, input.texcoord); float4 noiseColor = tex2D(_Noise, input.texcoord); float alpha = noiseColor.r - _MinAlpha; clip(alpha); if(alpha < 0.05) return float4(1,0.5,0,0) * alpha / 0.05; else return mainColor / 2;//除以2隻是為了暗一點 } ENDCG } }}
總結
簡單地利用雜訊圖進行透明度測試,就能實現燒熔的效果。
參考
http://gad.qq.com/program/translateview/7187984
http://gad.qq.com/article/detail/7190975
Unity小技巧 - 燒熔Shader