美文网首页
Shader学习——顶点漫反射,逐片元漫反射,逐片元半罗伯特漫反

Shader学习——顶点漫反射,逐片元漫反射,逐片元半罗伯特漫反

作者: BacteriumFox | 来源:发表于2019-08-21 23:13 被阅读0次

核心公式

  • 漫反射光=入射光线颜色强度 * 材质的漫反射系数 * 取值为正数 ( 表面法线方向 · 光源方向 )

效果展示

顶点漫反射,逐片元漫反射,半罗伯特漫反射

顶点漫反射

Shader "Unlit/005"
{
    Properties
    {
       _Diffuse("Diffuse",Color) = (1,1,1,1)
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 100

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"
            #include "Lighting.cginc"

            fixed4 _Diffuse;

            struct v2f
            {
                fixed3 color:Color;
                float4 vertex :SV_POSITION;
            };

            v2f vert (appdata_base v)
            {
                v2f o;
                //顶点位置
                o.vertex = UnityObjectToClipPos(v.vertex);
                //法线方向
                fixed3 worldNormal =UnityObjectToWorldNormal( v.normal);
                //光源方向
                fixed3 worldLight = normalize (_WorldSpaceLightPos0.xyz);
                //漫反射光=入射光线强度*材质的漫反射系数*取值为正数(表面法线方向 · 光源方向)
                fixed3 diffuse = _LightColor0.rgb * _Diffuse.rgb * saturate(dot(worldNormal,worldLight));

                //环境光
                fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;

                o.color = diffuse + ambient;
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
              return fixed4(i.color,1);
            }
            ENDCG
        }
    }
}

逐片元漫反射

Shader "Unlit/006"
{
    Properties
    {
       _Diffuse("Diffuse",Color) = (1,1,1,1)
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 100

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"
            #include "Lighting.cginc"

            fixed4 _Diffuse;

            struct v2f
            {
                float4 vertex :SV_POSITION;
                fixed3 worldNormal: TEXCOORD0;
            };

            v2f vert (appdata_base v)
            {
                v2f o;
                //顶点位置
                o.vertex = UnityObjectToClipPos(v.vertex);
                //法线方向
                fixed3 worldNormal =UnityObjectToWorldNormal( v.normal);
                o.worldNormal=worldNormal;
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {               
                //光源方向
                fixed3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz);
                //漫反射光=入射光线颜色强度*材质的漫反射系数*取值为正数(表面法线方向 · 光源方向)
                fixed3 diffuse = _LightColor0.rgb * _Diffuse.rgb * max(0,dot(i.worldNormal,worldLightDir));

                //环境光
                fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;

                fixed3 color = ambient + diffuse;

                return fixed4(color,1);
            }
            ENDCG
        }
    }
}

逐片元半罗伯特漫反射

Shader "Unlit/007"
{
    Properties
    {
       _Diffuse("Diffuse",Color) = (1,1,1,1)
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 100

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"
            #include "Lighting.cginc"

            fixed4 _Diffuse;

            struct v2f
            {
                float4 vertex :SV_POSITION;
                fixed3 worldNormal: TEXCOORD0;
            };

            v2f vert (appdata_base v)
            {
                v2f o;
                //顶点位置
                o.vertex = UnityObjectToClipPos(v.vertex);
                //法线方向
                fixed3 worldNormal =UnityObjectToWorldNormal( v.normal);
                o.worldNormal=worldNormal;
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {               
                //光源方向
                fixed3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz);
                //漫反射光=入射光线强度*材质的漫反射系数*取值为正数(表面法线方向 · 光源方向)
                fixed3 diffuse = _LightColor0.rgb * _Diffuse.rgb * (dot(worldLightDir,i.worldNormal)*0.5+0.5);

                //环境光
                fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;

                fixed3 color = ambient + diffuse;

                return fixed4(color,1);
            }
            ENDCG
        }
    }
}

相关文章

网友评论

      本文标题:Shader学习——顶点漫反射,逐片元漫反射,逐片元半罗伯特漫反

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