美文网首页
Shader简单应用

Shader简单应用

作者: 浯茗仔仔_2a06 | 来源:发表于2019-04-11 19:12 被阅读0次
//显示固定颜色
Shader "Custom/lesson01"{
    properties{
        _MainColor("颜色", Color) = (1,1,1,1)
    }


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

        CGPROGRAM

        #pragma surface mysurf Lambert

        struct Input{
            fixed4 color : COLOR;
        };
        fixed4 _MainColor;
        void mysurf(Input IN, inout SurfaceOutput o){
            o.Albedo = _MainColor;
        }

        ENDCG
    }
}



//显示贴图Shader
Shader "Custom/lesson01_02"{
    Properties{
        _MainTex("贴图", 2D) = "white"{}

    }

    subShader{
        Tags {"RenderType" = "Opaque"}

        CGPROGRAM

        #pragma surface surf Lambert

        struct Input{
            float2 uv_MainTex;
        };

        sampler2D _MainTex;
        void surf (Input IN, inout SurfaceOutput o){
            fixed4 c = tex2D(_MainTex, IN.uv_MainTex);
            o.Albedo = c.rgb;
        }

        ENDCG
    }

}

//显示贴图 + 法线 Shader
Shader "Custom/lesson01_03"{
    Properties{
        _MainTex("贴图", 2D) = "white"{}
        _BumpMap("法线贴图", 2D) = "bump"{}
    }

    subShader{
        Tags {"RenderType" = "Opaque"}

        CGPROGRAM

        #pragma surface surf Lambert

        struct Input{
            float2 uv_MainTex;
            float2 uv_BumpMap;
        };

        sampler2D _MainTex;
        sampler2D _BumpMap;
        void surf (Input IN, inout SurfaceOutput o){
            fixed4 c = tex2D(_MainTex, IN.uv_MainTex);
            //法线值
            half3 normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap));
            o.Albedo = c.rgb;
            o.Normal = normal;
        }

        ENDCG
    }

}



//显示边缘光照 Shader
Shader "Custom/lesson01_04"{
    Properties{
        _MainTex("贴图", 2D) = "white"{}
        _BumpMap("法线贴图", 2D) = "bump"{}
        _RimColor("边缘光颜色", Color) = (0.26,0.19,0.16,0.0)
        _RimPower("边缘光强度", Range(0, 10)) = 3.0
    }

    subShader{
        Tags {"RenderType" = "Opaque"}

        CGPROGRAM

        #pragma surface surf Lambert

        struct Input{
            float2 uv_MainTex;
            float2 uv_BumpMap;
            //摄像机相对阳光的方向
            float3 viewDir;
        };

        sampler2D _MainTex;
        sampler2D _BumpMap;
        fixed4 _RimColor;
        float _RimPower;
        void surf (Input IN, inout SurfaceOutput o){
            fixed4 c = tex2D(_MainTex, IN.uv_MainTex);
            //法线值
            half3 normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap));
            o.Albedo = c.rgb;
            o.Normal = normal;

            //计算眼睛看到区域边缘光的强度,法线向量与眼睛直视的夹角,夹角等于90度时,证明看到的位置在最边缘,边缘光越强
            //当夹角等于0时,是眼睛正对方向,没有边缘光
            half rim = 1 - dot(normalize(IN.viewDir) , o.Normal);
            o.Emission = _RimColor.rgb * pow(rim, _RimPower);
        }

        ENDCG
    }

}


//显示贴图 + 法线 + 细节贴图 Shader
Shader "Custom/lesson01_05"{
    Properties{
        _MainTex("贴图", 2D) = "white"{}
        _BumpMap("法线贴图", 2D) = "bump"{}
        _Detail("细节",2D) = "gray"{}
    }

    subShader{
        Tags {"RenderType" = "Opaque"}

        CGPROGRAM

        #pragma surface surf Lambert

        struct Input{
            float2 uv_MainTex;
            float2 uv_BumpMap;
            float2 uv_Detail;
        };

        sampler2D _MainTex;
        sampler2D _BumpMap;
        sampler2D _Detail;
        void surf (Input IN, inout SurfaceOutput o){
            fixed4 c = tex2D(_MainTex, IN.uv_MainTex);
            //法线值
            half3 normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap));
            o.Albedo = c.rgb;
            o.Albedo *= tex2D(_Detail, IN.uv_Detail) * 2;
            o.Normal = normal;
        }

        ENDCG
    }

}

//显示贴图 + 法线 + 屏幕空间细节贴图 Shader
Shader "Custom/lesson01_06"{
    Properties{
        _MainTex("贴图", 2D) = "white"{}
        _BumpMap("法线贴图", 2D) = "bump"{}
        _Detail("细节",2D) = "gray"{}
    }

    subShader{
        Tags {"RenderType" = "Opaque"}

        CGPROGRAM

        #pragma surface surf Lambert

        struct Input{
            float2 uv_MainTex;
            float2 uv_BumpMap;
            float2 uv_Detail;
            float4 screenPos;
        };

        sampler2D _MainTex;
        sampler2D _BumpMap;
        sampler2D _Detail;
        void surf (Input IN, inout SurfaceOutput o){
            //法线值
            half3 normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap));
            o.Normal = normal;
            fixed4 c = tex2D(_MainTex, IN.uv_MainTex);
            o.Albedo = c.rgb;

            //还原屏幕坐标
            float2 screenUV = IN.screenPos.xy/IN.screenPos.w;
            o.Albedo *= tex2D(_Detail, screenUV ) * 2;
        }

        ENDCG
    }

}


//立方体反射Shader
Shader "Custom/lesson01_07"{
    Properties{
        _MainTex("贴图", 2D) = "white"{}
        _Cube("CubeMap",CUBE) = ""{}
    }

    subShader{
        Tags {"RenderType" = "Opaque"}

        CGPROGRAM

        #pragma surface surf Lambert

        struct Input{
            float2 uv_MainTex;
            //世界空间反射向量
            float3 worldRefl;
        };

        sampler2D _MainTex;
        samplerCUBE _Cube;
        void surf (Input IN, inout SurfaceOutput o){
            fixed4 c = tex2D(_MainTex, IN.uv_MainTex);
            o.Albedo = c.rgb;


            o.Emission = texCUBE(_Cube, IN.worldRefl);
        }

        ENDCG
    }

}


//切片
Shader "Custom/lesson01_08"{
    Properties{
        _MainTex("贴图", 2D) = "white"{}
        _BumpMap("法线贴图", 2D) = "bump"{}
        _SliceNum("切片数量", Float) = 1
        _SliceAngle("切片角度", Float) = 1
    }

    subShader{
        Tags {"RenderType" = "Opaque"}

        CGPROGRAM

        #pragma surface surf Lambert

        struct Input{
            float2 uv_MainTex;
            float2 uv_BumpMap;
            float3 worldPos;
        };

        sampler2D _MainTex;
        sampler2D _BumpMap;
        float _SliceNum;
        float _SliceAngle;
        void surf (Input IN, inout SurfaceOutput o){
            //clip清除负数的像素    frac取小数  _SliceNum没米切多少个
            clip(frac((IN.worldPos.y + IN.worldPos.z * _SliceAngle) * _SliceNum)  - 0.5);
            //法线值
            o.Albedo = tex2D(_MainTex, IN.uv_MainTex);
            o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap));
       
        }

        ENDCG
    }

}


//法线挤压与顶点修改
Shader "Custom/lesson01_09"{
    Properties{
        _MainTex("贴图", 2D) = "white"{}
        _Amount("挤压强度",Float) = 1
    }

    subShader{
        Tags {"RenderType" = "Opaque"}

        CGPROGRAM

        #pragma surface surf Lambert vertex:vert

        struct Input{
            float2 uv_MainTex;
        };

        sampler2D _MainTex;
        float _Amount;

        //顶点数据
        void vert (inout appdata_full v){
            //将顶点延法线向量 向外扩张 _Amount
            v.vertex.xyz += v.normal * _Amount;
        }


        void surf (Input IN, inout SurfaceOutput o){
            fixed4 c = tex2D(_MainTex, IN.uv_MainTex);
            o.Albedo = c.rgb;
        }

        ENDCG
    }

}


//法线挤压与顶点修改
Shader "Custom/lesson01_09"{
    Properties{
        _MainTex("贴图", 2D) = "white"{}
        _Amount("挤压强度",Float) = 1
    }

    subShader{
        Tags {"RenderType" = "Opaque"}

        CGPROGRAM

        #pragma surface surf Lambert vertex:vert

        struct Input{
            float2 uv_MainTex;
        };

        sampler2D _MainTex;
        float _Amount;

        //顶点数据
        void vert (inout appdata_full v){
            //将顶点延法线向量 向外扩张 _Amount
            v.vertex.xyz += v.normal * _Amount;
        }


        void surf (Input IN, inout SurfaceOutput o){
            fixed4 c = tex2D(_MainTex, IN.uv_MainTex);
            o.Albedo = c.rgb;
        }

        ENDCG
    }

}


//最终颜色修改
Shader "Custom/lesson01_11"{
    Properties{
        _MainTex("贴图", 2D) = "white"{}
        _ColorTint("最终色", Color) = (1,1,1,1)
    }

    subShader{
        Tags {"RenderType" = "Opaque"}

        CGPROGRAM
        #pragma surface surf Lambert finalcolor:myfinal

        struct Input{
            float2 uv_MainTex;
        };

        sampler2D _MainTex;
        fixed4 _ColorTint;

        void surf (Input IN, inout SurfaceOutput o){
            fixed4 c = tex2D(_MainTex, IN.uv_MainTex);
            o.Albedo = c.rgb;
        }

        //最终颜色修改   color在surf执行完之后的颜色 
        void myfinal(Input IN, SurfaceOutput o, inout fixed4 color ){
            color *= _ColorTint;
        }

        ENDCG
    }

}

// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'


//自定义雾效
Shader "Custom/lesson01_12"{
    Properties{
        _MainTex("贴图", 2D) = "white"{}
        _FogColor("雾颜色", Color) = (1,1,1,1)
    }

    subShader{
        Tags {"RenderType" = "Opaque"}

        CGPROGRAM

        #pragma surface surf Lambert finalcolor:final vertex:vert

        struct Input{
            float2 uv_MainTex;
            fixed fog;
        };

        sampler2D _MainTex;
        fixed4 _FogColor;

        void vert(inout appdata_full v, out Input data){
            //初始化
            UNITY_INITIALIZE_OUTPUT(Input, data);

            //矩阵相乘 三维坐标转屏幕坐标
            float4 hpos = UnityObjectToClipPos(v.vertex);
            //0.1 十米范围内,渐变
            data.fog =  min(1, dot(hpos.xy,hpos.xy) * 0.01);
        }

        void surf (Input IN, inout SurfaceOutput o){
            fixed4 c = tex2D(_MainTex, IN.uv_MainTex);
            o.Albedo = c.rgb;
        }

        void final(Input IN, SurfaceOutput o, inout fixed4 color){
           //从本身颜色,到自选颜色,差值为十米内渐变的值
            color.rgb = lerp(color.rgb, _FogColor, IN.fog);
        }

        ENDCG
    }

}

相关文章

网友评论

      本文标题:Shader简单应用

      本文链接:https://www.haomeiwen.com/subject/pivxwqtx.html