91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

ShaderLab學習小結(七)用插值函數lerp漸變顏色

發布時間:2020-07-20 20:01:35 來源:網絡 閱讀:28182 作者:lreach 欄目:游戲開發

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

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

功能很簡單,實現也很簡單。
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                                         //產生漸變的范圍值
    }
    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值的判斷和顏色的插值要寫在片斷程序中才能產生圖上的漸變效果,寫在頂點程序中是不行的,因為只有八個角八個頂點,非紅即綠,不會有顏色漸變。
但是要在頂點程序中獲取物體坐標系下的y坐標,所以結構體中定義了y,且在頂點程序中賦值:

o.y = v.vertex.y;

再在片斷程序中獲取:

float y =IN.y;

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

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

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

代碼中插值函數的比重 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,即我們定義的紅。

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

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

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

孝义市| 镇雄县| 禹城市| 綦江县| 黑龙江省| 贵阳市| 四会市| 竹溪县| 溧阳市| 梁河县| 广州市| 临江市| 内江市| 肇州县| 英山县| 旬阳县| 瑞昌市| 疏附县| 清苑县| 锦屏县| 合阳县| 彭泽县| 青海省| 和林格尔县| 宁乡县| 丹巴县| 苍南县| 鄂尔多斯市| 谷城县| 闵行区| 江源县| 扎赉特旗| 应城市| 黑水县| 保康县| 上虞市| 涞源县| 木里| 鹤山市| 黄浦区| 安西县|