ShaderLab學習小結(jié)(七)用插值函數(shù)lerp漸變顏色-創(chuàng)新互聯(lián)

運行環(huán)境:
Win10 x64
Unity 5.5.4
在場景中創(chuàng)建一個cube,使它的顏色產(chǎn)生簡單的兩種顏色過渡的漸變效果,如下圖:
ShaderLab學習小結(jié)(七)用插值函數(shù)lerp漸變顏色
先說一下CG語言中的lerp函數(shù)
lerp(a, b, w);

“專業(yè)、務(wù)實、高效、創(chuàng)新、把客戶的事當成自己的事”是我們每一個人一直以來堅持追求的企業(yè)文化。 創(chuàng)新互聯(lián)是您可以信賴的網(wǎng)站建設(shè)服務(wù)商、專業(yè)的互聯(lián)網(wǎng)服務(wù)提供商! 專注于成都網(wǎng)站設(shè)計、成都網(wǎng)站制作、軟件開發(fā)、設(shè)計服務(wù)業(yè)務(wù)。我們始終堅持以客戶需求為導向,結(jié)合用戶體驗與視覺傳達,提供有針對性的項目解決方案,提供專業(yè)性的建議,創(chuàng)新互聯(lián)建站將不斷地超越自我,追逐市場,引領(lǐng)市場!

a與b為同類形,即都是float或者float2之類的,那lerp函數(shù)返回的結(jié)果也是與ab同類型的值。
w是比重,在0到1之間
當w為0時返回a,為1時返回b,在01之間時,以比重w將ab進行線性插值計算。

功能很簡單,實現(xiàn)也很簡單。
Shader代碼:

Shader "Custom/TestRedYellow" {
    Properties{
        _MainColor("MainColor", color) = (0,1,0,1)           //第一種顏色:綠
        _SecondColor("SecondColor", color) = (1,0,0,1) //第二種顏色:紅
        _Center("Center", range(-0.51,0.51)) = 0              //中心點y坐標值
        _R("R", range(0,1)) = 0.2                                         //產(chǎn)生漸變的范圍值
    }
    SubShader {
        pass {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "unitycg.cginc"
            fixed4 _MainColor;
            fixed4 _SecondColor;
            float _Center;
            float _R;
            struct v2f {
                float4 pos:POSITION;
                float y : TEXCOORD0;
            };
            v2f vert(appdata_base v)
            {
                v2f o;
                o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
                o.y = v.vertex.y;
                return o;
            }
            fixed4 frag(v2f IN):COLOR
            {
                float y = IN.y;
                float s = y -( _Center - _R/2);
                float f = saturate(s / _R);
                fixed4 col = lerp(_MainColor, _SecondColor, f);
                return col;
            }
            ENDCG
        }
    }
}

對y值的判斷和顏色的插值要寫在片斷程序中才能產(chǎn)生圖上的漸變效果,寫在頂點程序中是不行的,因為只有八個角八個頂點,非紅即綠,不會有顏色漸變。
但是要在頂點程序中獲取物體坐標系下的y坐標,所以結(jié)構(gòu)體中定義了y,且在頂點程序中賦值:

o.y = v.vertex.y;

再在片斷程序中獲取:

float y =IN.y;

以_R為范圍,其實是在中心點_Center兩端從-R/2到R/2這個范圍中
這個顏色漸變的范圍的起點應(yīng)該是:(_Center-R/2)。

float s = y -( _Center - _R/2);

(注意:Center-R/2為顏色漸變的范圍的起點y坐標,或者說是范圍的下端點坐標,范圍長度是_R。
這個起點可以根據(jù)需要自己調(diào)整,也可以就是_Center,或者別的值。)

代碼中插值函數(shù)的比重 f為:

float f = saturate(s / _R);

當s<0時,即y坐標在_Center以下,且距_Center大于_R/2的距離,f=0,則返回的顏色為_MainColor,即我們定義的綠。
當s>_R時,即y坐標在_Center以上,且距_Center大于_R/2的距離,f=1,則返回的顏色為_SecondColor,即我們定義的紅。

這樣,最終結(jié)果為,以cube的y坐標_Center為中心,以長度為_R的(_Center-_R/2, _Center+_R/2)為范圍,對_MainColor和_SecondColor進行漸變處理。小于此范圍的顯示_MainColor,大于此范圍的顯示_SecondColor。

Unity的Inspector面板中的材質(zhì):
我們將中心點_Center設(shè)置為0,即cube中心,漸變范圍_R設(shè)置為1
ShaderLab學習小結(jié)(七)用插值函數(shù)lerp漸變顏色
這樣就能實現(xiàn)cube從下至上整體的從綠到紅的顏色漸變了(看起來效果比較明顯)
ShaderLab學習小結(jié)(七)用插值函數(shù)lerp漸變顏色
將_R調(diào)節(jié)至0,即漸變范圍為0,不漸變
ShaderLab學習小結(jié)(七)用插值函數(shù)lerp漸變顏色
綠到紅沒有任何過度,有明確的分界線
ShaderLab學習小結(jié)(七)用插值函數(shù)lerp漸變顏色

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。

當前標題:ShaderLab學習小結(jié)(七)用插值函數(shù)lerp漸變顏色-創(chuàng)新互聯(lián)
轉(zhuǎn)載來源:http://bm7419.com/article28/ighjp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供移動網(wǎng)站建設(shè)、服務(wù)器托管、網(wǎng)站導航微信公眾號、企業(yè)網(wǎng)站制作、面包屑導航

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都app開發(fā)公司