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得到内置的光照变量
            Tags{"LightMode" = "ForwardBase"}

            CGPROGRAM
            //包含unity的内置的文件,才可以使用unity内置的一些变量  相当于引入内置的光照模型
            #include "Lighting.cginc"//取得第一个直射光的颜色  _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 这个矩阵用来把一个坐标从模型空间转换到剪裁空间
                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 这个矩阵用来把一个方向从世界空间转换到模型空间
        fixed3 normalDir = normalize(f.WorldNomormal);//相当于把模型空间转换到世界空间

        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

纹理材质.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得到内置的光照变量
            Tags{"LightMode" = "ForwardBase"}

            CGPROGRAM


#include "Lighting.cginc"//取得第一个直射光的颜色  _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是用来确定切线空间中坐标轴的方向的

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

            float3 lightDir : TEXCOORD0;//切线空间下 平行光的方向
            
            float4 uv:TEXCOORD1;//xy用来存储MainTex的纹理坐标, zw用来存储法线贴图的纹理坐标


        }; 
        v2f vert(a2v v) {
                v2f f;
                //UNITY_MATRIX_MVP 这个矩阵用来把一个坐标从模型空间转换到剪裁空间
                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;//调用这个后,会得到一个矩阵 rotation 这个矩阵用来把模型空间下的方向装换成切线空间下

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

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

                return f;
        };
        //把所有的跟法线方向有关的运算都放在切线空间下
        //从法线贴图里面取得的法线方向是在切线空间下的
        fixed4 frag(v2f f) :SV_Target{

    
         //_World2Object 这个矩阵用来把一个方向从世界空间转换到模型空间
        //fixed3 normalDir = normalize(f.WorldNomormal);//相当于把模型空间转换到世界空间

        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得到内置的光照变量
            Tags{"LightMode" = "ForwardBase"}

            ZWrite off//写入透明深度
            Blend SrcAlpha OneMinusSrcAlpha//透明混合参数


            CGPROGRAM


            #include "Lighting.cginc"//取得第一个直射光的颜色  _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是用来确定切线空间中坐标轴的方向的

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

            float3 lightDir : TEXCOORD0;//切线空间下 平行光的方向
            
            float4 uv:TEXCOORD1;//xy用来存储MainTex的纹理坐标, zw用来存储法线贴图的纹理坐标


        }; 
        v2f vert(a2v v) {
                v2f f;
                //UNITY_MATRIX_MVP 这个矩阵用来把一个坐标从模型空间转换到剪裁空间
                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;//调用这个后,会得到一个矩阵 rotation 这个矩阵用来把模型空间下的方向装换成切线空间下

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

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

                return f;
        };
        //把所有的跟法线方向有关的运算都放在切线空间下
        //从法线贴图里面取得的法线方向是在切线空间下的
        fixed4 frag(v2f f) :SV_Target{

    
         //_World2Object 这个矩阵用来把一个方向从世界空间转换到模型空间
        //fixed3 normalDir = normalize(f.WorldNomormal);//相当于把模型空间转换到世界空间

        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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,064评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,606评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,011评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,550评论 1 269
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,465评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,919评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,428评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,075评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,208评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,185评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,191评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,914评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,482评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,585评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,825评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,194评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,703评论 2 339

推荐阅读更多精彩内容