Unity小技巧 - 燒熔Shader

來源:互聯網
上載者:User

標籤:技巧   著色器   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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.