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

核心公式

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

效果展示

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

顶点漫反射

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
        }
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容