Unity內(nèi)置Shader解讀1——Bumped Diffuse

1.Shader在什么情況下使用

Bumped(凹凸) Diffuse(漫反射)祷肯,凹凸漫反射,就是我們Shader中最最基礎(chǔ)的粱玲,只有三項可以設(shè)置:
1.Main Color顏色
2.Base (RGB)漫反射貼圖
3.Normalmap法線貼圖


image.png

看到可設(shè)置的項基本就知道了這個shader只能做非彻恚基礎(chǔ)的效果,簡單支持了一下法線貼圖抽减。


image.png

2.Shader的價值(用的多不多)允青,Shader的難度

Bumped Diffuse作為舊shader中的C位,其實在Unity4時代用的是非常多的卵沉,實現(xiàn)方式也比較簡單颠锉。

3.代碼詳細(xì)注釋

// Unity built-in shader source. Copyright (c) 2016 Unity Technologies. MIT license (see license.txt)
//凹凸漫反射
Shader "Legacy Shaders/Bumped Diffuse" {
    Properties {
        _Color ("Main Color", Color) = (1,1,1,1)//顏色
        _MainTex ("Base (RGB)", 2D) = "white" {}//漫反射貼圖
        _BumpMap ("Normalmap", 2D) = "bump" {}//法線貼圖
    }

    SubShader {
        Tags { 
            "RenderType"="Opaque" 
        }
        LOD 300

        CGPROGRAM
        //聲明主要執(zhí)行函數(shù)名為surf,使用Lambert光照模型
        #pragma surface surf Lambert 

        //上述屬性對應(yīng)參數(shù)
        sampler2D _MainTex;
        sampler2D _BumpMap;
        fixed4 _Color;

        //輸入兩套UV
        struct Input {
            float2 uv_MainTex;
            float2 uv_BumpMap;
        };

        void surf (Input IN, inout SurfaceOutput o) {
            //tex2D函數(shù)采樣圖像紋理并與用戶自定義的_Color相乘
            fixed4 c = tex2D(_MainTex, IN.uv_MainTex) * _Color;
            //Albedo漫反射顏色設(shè)置為c的rgb
            o.Albedo = c.rgb;
            //透明度設(shè)置為c的透明史汗,但是本shader未聲明透明混合方式
            //個人認(rèn)為此處的透明設(shè)置是無效的琼掠,所以是一句廢代碼
            //如果想要透明可以參照Transparent/Alpha-Bumped
            //在#pragma surface surf Lambert 后添加alpha:fade透明混合模式
            o.Alpha = c.a;
            //tex2D函數(shù)采樣法線貼圖紋理
            //法線貼圖在進(jìn)入Unity中并設(shè)置為Normal map格式的時候進(jìn)行了一次優(yōu)化壓縮
            //這也就是為什么修改為Normal map格式后圖片的顏色會變成藍(lán)色調(diào)
            //UnpackNormal是Unity將儲存的法線顏色逆轉(zhuǎn)換出來
            o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap));
        }
        ENDCG
    }

    FallBack "Legacy Shaders/Diffuse"
}

4.Shader編寫思路,用到的知識點

法線貼圖的思路其實早就寫過了停撞,可以查看這篇瓷蛙。
這里有下面幾個知識點需要注意一下:

tex2D函數(shù)

根據(jù)uv坐標(biāo)找到貼圖上對應(yīng)的點顏色

UnpackNormal函數(shù)

UnpackNormal可以從這篇中獲得詳解
法線貼圖在進(jìn)入Unity中并設(shè)置為Normal map格式的時候進(jìn)行了一次優(yōu)化壓縮
這也就是為什么修改為Normal map格式后圖片的顏色會變成藍(lán)色調(diào)
UnpackNormal是Unity將儲存的法線顏色逆轉(zhuǎn)換出來
UnpackNormal是UnityCG.cginc提供的函數(shù),實際封裝內(nèi)容如下:

inline fixed3 UnpackNormal(fixed4 packednormal)
{
#if defined(UNITY_NO_DXT5nm)
    return packednormal.xyz * 2 - 1;
#elif defined(UNITY_ASTC_NORMALMAP_ENCODING)
    return UnpackNormalDXT5nm(packednormal);
#else
    return UnpackNormalmapRGorAG(packednormal);
#endif
}

跳轉(zhuǎn)了UnpackNormalDXT5nm和UnpackNormalmapRGorAG戈毒,內(nèi)容大致一樣:

inline fixed3 UnpackNormalDXT5nm (fixed4 packednormal)
{
    fixed3 normal;
    normal.xy = packednormal.wy * 2 - 1;
    normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));
    return normal;
}
//按DXT5nm(1艰猬,y,1埋市,x)或BC5(x冠桃,y,0道宅,1)標(biāo)準(zhǔn)拆封
//注意像“bump”這樣的中性紋理是(0食听,0胸蛛,1,1)用于普通RGB normal和DXT5nm/BC5
fixed3 UnpackNormalmapRGorAG(fixed4 packednormal)
{
    // This do the trick
   packednormal.x *= packednormal.w;

    fixed3 normal;
    normal.xy = packednormal.xy * 2 - 1;
    normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));
    return normal;
}

看上篇或者看下圖理解:


image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末樱报,一起剝皮案震驚了整個濱河市葬项,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌肃弟,老刑警劉巖玷室,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件零蓉,死亡現(xiàn)場離奇詭異笤受,居然都是意外死亡,警方通過查閱死者的電腦和手機敌蜂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進(jìn)店門箩兽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人章喉,你說我怎么就攤上這事汗贫。” “怎么了秸脱?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵落包,是天一觀的道長。 經(jīng)常有香客問我摊唇,道長咐蝇,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任巷查,我火速辦了婚禮有序,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘岛请。我一直安慰自己旭寿,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布崇败。 她就那樣靜靜地躺著盅称,像睡著了一般。 火紅的嫁衣襯著肌膚如雪后室。 梳的紋絲不亂的頭發(fā)上缩膝,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天,我揣著相機與錄音咧擂,去河邊找鬼逞盆。 笑死,一個胖子當(dāng)著我的面吹牛松申,可吹牛的內(nèi)容都是我干的云芦。 我是一名探鬼主播俯逾,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼舅逸!你這毒婦竟也來了桌肴?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤琉历,失蹤者是張志新(化名)和其女友劉穎坠七,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體旗笔,經(jīng)...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡彪置,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了蝇恶。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拳魁。...
    茶點故事閱讀 39,953評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖撮弧,靈堂內(nèi)的尸體忽然破棺而出潘懊,到底是詐尸還是另有隱情,我是刑警寧澤贿衍,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布授舟,位于F島的核電站,受9級特大地震影響贸辈,放射性物質(zhì)發(fā)生泄漏释树。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一裙椭、第九天 我趴在偏房一處隱蔽的房頂上張望躏哩。 院中可真熱鬧,春花似錦揉燃、人聲如沸扫尺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽正驻。三九已至,卻和暖如春抢腐,著一層夾襖步出監(jiān)牢的瞬間姑曙,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工迈倍, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留伤靠,地道東北人。 一個月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓啼染,卻偏偏與公主長得像宴合,于是被迫代替她去往敵國和親焕梅。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,901評論 2 355

推薦閱讀更多精彩內(nèi)容