Shader編程(三)紋理貼圖、法線映射與Alpha透明度


Shader"Texture"{
    properties{
        _Color("Color",Color) = (1,1,1,1)
        _MainText("Main Tex",2D) = "White"{}
        _Specular("Specular Color",Color) = (1,1,1,1)//控制高光顏色
       _Gloss("Gloss",Range(8,200)) = 10//控制高光強度

    }
        SubShader{

        Pass {

            //定義正確的LightMode得到內(nèi)置的光照變量
            Tags{"LightMode" = "ForwardBase"}

            CGPROGRAM
            //包含unity的內(nèi)置的文件奸攻,才可以使用unity內(nèi)置的一些變量  相當(dāng)于引入內(nèi)置的光照模型
            #include "Lighting.cginc"http://取得第一個直射光的顏色  _LightColor0第一個值是光的位置_WorldSpaceLightPos0

            #pragma vertex vert
            #pragma fragment frag

                      // fixed4 _Diffuse;
                  sampler2D _MainText;
                  fixed4 _Color;
                  float4 _MainText_ST;//固定寫法定義UV貼圖偏移值縮放值
                   half _Gloss;
                   fixed4 _Specular;

            struct a2v {
               float4 vertex:POSITION;
               float3 normal:NORMAL; 
               float2 texcoord:TEXCOORD0;
              };
        struct v2f {
        
            float4 position:SV_POSITION;
            float3 WorldNomormal : TEXCOORD0;
            float3 WorldVertex:TEXCOORD1;
            float2 uv:TEXCOORD2;


        }; 
        v2f vert(a2v v) {
                v2f f;
                //UNITY_MATRIX_MVP 這個矩陣用來把一個坐標(biāo)從模型空間轉(zhuǎn)換到剪裁空間
                f.position = mul(UNITY_MATRIX_MVP, v.vertex);
    
                f.WorldNomormal = mul(v.normal, (float3x3)unity_WorldToObject);
                f.WorldVertex = mul(v.vertex,unity_WorldToObject).xyz;
                f.uv = v.texcoord.xy* _MainText_ST.xy+ _MainText_ST.zw;//計算紋理的偏移值和縮放值
                return f;
        };

        fixed4 frag(v2f f) :SV_Target{

    
         //_World2Object 這個矩陣用來把一個方向從世界空間轉(zhuǎn)換到模型空間
        fixed3 normalDir = normalize(f.WorldNomormal);//相當(dāng)于把模型空間轉(zhuǎn)換到世界空間

        fixed3 lightDir = normalize(_WorldSpaceLightPos0.xyz);//對于每一個頂點來說 光的位置就是光的方向  因為光是平行光

         fixed3 texColor=tex2D(_MainText,f.uv.xy)*_Color.rgb;

        fixed3 diffuse = _LightColor0.rgb*texColor*max(dot(normalDir, lightDir),0);//取得漫反射的顏色

        fixed3 reflectDir = normalize(reflect(-lightDir, normalDir));
        fixed3 vlewDir = normalize(_WorldSpaceCameraPos.xyz - f.WorldVertex);

        fixed3 specular = _LightColor0.rgb*_Specular.rgb*pow(max(dot(reflectDir, vlewDir), 0), _Gloss);//計算高光

        fixed3 tempColor = diffuse +  specular+ UNITY_LIGHTMODEL_AMBIENT.rgb*texColor;

            return fixed4(tempColor,1);

        }
            ENDCG
       }
    }
        Fallback"Diffuse"
}
Paste_Image.png

紋理材質(zhì).gif

法線貼圖與凹凸映射的強度

Shader"Rock"{
    properties{
        _Color("Color",Color) = (1,1,1,1)
        _MainTex("Main Tex",2D) = "White"{}
        _NormalMap("Normal Map",2D) = "bump"{}//bump使用頂點里面自帶的法線貼圖
        _BumpScale("Bump Scale",Float)=1
    }
        SubShader{

        Pass {

            //定義正確的LightMode得到內(nèi)置的光照變量
            Tags{"LightMode" = "ForwardBase"}

            CGPROGRAM


#include "Lighting.cginc"http://取得第一個直射光的顏色  _LightColor0第一個值是光的位置_WorldSpaceLightPos0


        
            

            #pragma vertex vert
            #pragma fragment frag

                  fixed4 _Color;
                  sampler2D _MainTex;
                  float4 _MainTex_ST;//固定寫法定義UV貼圖偏移值縮放值
                  sampler2D _NormalMap;
                  float4 _NormalMap_ST;//固定寫法定義UV貼圖偏移值縮放值
                  float _BumpScale;

            struct a2v {
               float4 vertex:POSITION;
               //切線空間的確定是通過(存儲到模型里面的)法線和(存儲到模型里面的)切線確定的
               float3 normal:NORMAL; 
               float4 tangent:TANGENT;//tangent.w是用來確定切線空間中坐標(biāo)軸的方向的

               float2 texcoord:TEXCOORD0;
              };
        struct v2f {
        
            float4 position:SV_POSITION;
            //float3 WorldNomormal : TEXCOORD0;

            float3 lightDir : TEXCOORD0;//切線空間下 平行光的方向
            
            float4 uv:TEXCOORD1;//xy用來存儲MainTex的紋理坐標(biāo), zw用來存儲法線貼圖的紋理坐標(biāo)


        }; 
        v2f vert(a2v v) {
                v2f f;
                //UNITY_MATRIX_MVP 這個矩陣用來把一個坐標(biāo)從模型空間轉(zhuǎn)換到剪裁空間
                f.position = mul(UNITY_MATRIX_MVP, v.vertex);
    
                /*f.WorldNomormal = mul(v.normal, (float3x3)unity_WorldToObject);*/
                
                f.uv.xy = v.texcoord.xy * _MainTex_ST.xy+ _MainTex_ST.zw;//計算紋理的偏移值和縮放值
                f.uv.zw = v.texcoord.xy * _NormalMap_ST.xy + _NormalMap_ST.zw;
                
                TANGENT_SPACE_ROTATION;//調(diào)用這個后虱痕,會得到一個矩陣 rotation 這個矩陣用來把模型空間下的方向裝換成切線空間下

                //ObjspaceLightDir(v.vertex)//得到模型空間下的平行光方向

                f.lightDir = mul(rotation, ObjSpaceLightDir(v.vertex));

                return f;
        };
        //把所有的跟法線方向有關(guān)的運算都放在切線空間下
        //從法線貼圖里面取得的法線方向是在切線空間下的
        fixed4 frag(v2f f) :SV_Target{

    
         //_World2Object 這個矩陣用來把一個方向從世界空間轉(zhuǎn)換到模型空間
        //fixed3 normalDir = normalize(f.WorldNomormal);//相當(dāng)于把模型空間轉(zhuǎn)換到世界空間

        fixed4 normalColor= tex2D(_NormalMap,f.uv.zw);


        //pixel = (normal + 1) / 2

        //normal = pixel * 2 - 1
        
        fixed3 tangentNormal = UnpackNormal( normalColor);  //切線空間下的法線

        tangentNormal.xy = tangentNormal.xy*_BumpScale;

        tangentNormal = normalize(tangentNormal);

        fixed3 lightDir = normalize(f.lightDir);//對于每一個頂點來說 光的位置就是光的方向  因為光是平行光

        fixed3 texColor=tex2D(_MainTex,f.uv.xy)*_Color.rgb;

        fixed3 diffuse = _LightColor0.rgb*texColor*max(dot(tangentNormal, lightDir),0);//取得漫反射的顏色

        fixed3 tempColor = diffuse + UNITY_LIGHTMODEL_AMBIENT.rgb*texColor;

    return fixed4(tempColor,1);

        }
            ENDCG
       }
    }
        Fallback"Spacular"
}
凹凸貼圖.gif

編寫透明的Shader

Shader"Rock Alpha" {
    properties{
        _Color("Color",Color) = (1,1,1,1)
        _MainTex("Main Tex",2D) = "White"{}
        _NormalMap("Normal Map",2D) = "bump"{}//bump使用頂點里面自帶的法線貼圖
        _BumpScale("Bump Scale",Float)=1
        _Alpha("Alpha",Float)=1
    }
        SubShader{

            Tags{"Queue"="Transparent""IngnoreProjector"="True""RanderType"="Transparent"}//"Queue"="Transparent"透明的渲染隊列  "IngnoreProjector"="True"是否忽略投影 "RanderType"="Transparent"類型

        Pass {

            //定義正確的LightMode得到內(nèi)置的光照變量
            Tags{"LightMode" = "ForwardBase"}

            ZWrite off//寫入透明深度
            Blend SrcAlpha OneMinusSrcAlpha//透明混合參數(shù)


            CGPROGRAM


            #include "Lighting.cginc"http://取得第一個直射光的顏色  _LightColor0第一個值是光的位置_WorldSpaceLightPos0
            #pragma vertex vert
            #pragma fragment frag

                  fixed4 _Color;
                  sampler2D _MainTex;
                  float4 _MainTex_ST;//固定寫法定義UV貼圖偏移值縮放值
                  sampler2D _NormalMap;
                  float4 _NormalMap_ST;//固定寫法定義UV貼圖偏移值縮放值
                  float _BumpScale;
                  float _Alpha;

            struct a2v {
               float4 vertex:POSITION;
               //切線空間的確定是通過(存儲到模型里面的)法線和(存儲到模型里面的)切線確定的
               float3 normal:NORMAL; 
               float4 tangent:TANGENT;//tangent.w是用來確定切線空間中坐標(biāo)軸的方向的

               float2 texcoord:TEXCOORD0;
              };
        struct v2f {
        
            float4 position:SV_POSITION;
            //float3 WorldNomormal : TEXCOORD0;

            float3 lightDir : TEXCOORD0;//切線空間下 平行光的方向
            
            float4 uv:TEXCOORD1;//xy用來存儲MainTex的紋理坐標(biāo)睹耐, zw用來存儲法線貼圖的紋理坐標(biāo)


        }; 
        v2f vert(a2v v) {
                v2f f;
                //UNITY_MATRIX_MVP 這個矩陣用來把一個坐標(biāo)從模型空間轉(zhuǎn)換到剪裁空間
                f.position = mul(UNITY_MATRIX_MVP, v.vertex);
    
                /*f.WorldNomormal = mul(v.normal, (float3x3)unity_WorldToObject);*/
                
                f.uv.xy = v.texcoord.xy * _MainTex_ST.xy+ _MainTex_ST.zw;//計算紋理的偏移值和縮放值
                f.uv.zw = v.texcoord.xy * _NormalMap_ST.xy + _NormalMap_ST.zw;
                
                TANGENT_SPACE_ROTATION;//調(diào)用這個后,會得到一個矩陣 rotation 這個矩陣用來把模型空間下的方向裝換成切線空間下

                //ObjspaceLightDir(v.vertex)//得到模型空間下的平行光方向

                f.lightDir = mul(rotation, ObjSpaceLightDir(v.vertex));

                return f;
        };
        //把所有的跟法線方向有關(guān)的運算都放在切線空間下
        //從法線貼圖里面取得的法線方向是在切線空間下的
        fixed4 frag(v2f f) :SV_Target{

    
         //_World2Object 這個矩陣用來把一個方向從世界空間轉(zhuǎn)換到模型空間
        //fixed3 normalDir = normalize(f.WorldNomormal);//相當(dāng)于把模型空間轉(zhuǎn)換到世界空間

        fixed4 normalColor= tex2D(_NormalMap,f.uv.zw);


        //pixel = (normal + 1) / 2

        //normal = pixel * 2 - 1
        
        fixed3 tangentNormal = UnpackNormal( normalColor);  //切線空間下的法線

        tangentNormal.xy = tangentNormal.xy*_BumpScale;

        tangentNormal = normalize(tangentNormal);

        fixed3 lightDir = normalize(f.lightDir);//對于每一個頂點來說 光的位置就是光的方向  因為光是平行光

        fixed4 texColor=tex2D(_MainTex,f.uv.xy)*_Color;

        fixed3 diffuse = _LightColor0.rgb*texColor.rgb*max(dot(tangentNormal, lightDir),0);//取得漫反射的顏色

        fixed3 tempColor = diffuse + UNITY_LIGHTMODEL_AMBIENT.rgb*texColor;

    return fixed4(tempColor, _Alpha*texColor.a);

        }
            ENDCG
       }
    }
        Fallback"Spacular"
}
寫入透明度.gif
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末部翘,一起剝皮案震驚了整個濱河市硝训,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌新思,老刑警劉巖窖梁,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異夹囚,居然都是意外死亡纵刘,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進店門荸哟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來假哎,“玉大人,你說我怎么就攤上這事鞍历《婺ǎ” “怎么了?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵劣砍,是天一觀的道長惧蛹。 經(jīng)常有香客問我,道長秆剪,這世上最難降的妖魔是什么赊淑? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮仅讽,結(jié)果婚禮上陶缺,老公的妹妹穿的比我還像新娘。我一直安慰自己洁灵,他們只是感情好饱岸,可當(dāng)我...
    茶點故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布掺出。 她就那樣靜靜地躺著,像睡著了一般苫费。 火紅的嫁衣襯著肌膚如雪汤锨。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天百框,我揣著相機與錄音闲礼,去河邊找鬼。 笑死铐维,一個胖子當(dāng)著我的面吹牛柬泽,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播嫁蛇,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼锨并,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了睬棚?” 一聲冷哼從身側(cè)響起第煮,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎抑党,沒想到半個月后包警,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡底靠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年揽趾,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片苛骨。...
    茶點故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖苟呐,靈堂內(nèi)的尸體忽然破棺而出痒芝,到底是詐尸還是另有隱情,我是刑警寧澤牵素,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布严衬,位于F島的核電站,受9級特大地震影響笆呆,放射性物質(zhì)發(fā)生泄漏请琳。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一赠幕、第九天 我趴在偏房一處隱蔽的房頂上張望俄精。 院中可真熱鬧,春花似錦榕堰、人聲如沸竖慧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽圾旨。三九已至踱讨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間砍的,已是汗流浹背痹筛。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留廓鞠,地道東北人帚稠。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像诫惭,于是被迫代替她去往敵國和親翁锡。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,933評論 2 355

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