光照模型-漫反射兰伯特定律 _01

2020-06-02  本文已影响0人  Rayson

光源与物体表面相交只会有两个结果:

    Shader "Unity Shaders Book/Chapter 6/Diffuse Vertex-Level"{
    Properties{
        _Diffuse("Diffuse",color) = (1,1,1,1)
    }
    SubShader{
        Pass{
            Tags{"LightMode" = "ForwardBase"}//设置前向渲染
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "Lighting.cginc"
            fixed4 _Diffuse;
            struct a2v{
                float4 vertex:POSITION;
                float3 normal:NORMAL;
            };
            struct v2f{
                float4 pos:SV_POSITION;
                fixed3 color:COLOR;
            };

            v2f vert(a2v v){
                v2f o;
                o.pos=UnityObjectToClipPos(v.vertex);
                fixed3 ambient=UNITY_LIGHTMODEL_AMBIENT.xyz;
                fixed3 worldNormal=normalize(mul(v.normal,(float3x3)unity_WorldToObject));
                fixed3 worldLight=normalize(_WorldSpaceLightPos0.xyz);
                fixed3 diffuse=_LightColor0.rgb*_Diffuse.rgb*saturate(dot(worldNormal,worldLight));
                o.color=ambient+diffuse;
                return o;
            }

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

            ENDCG
        }
    }
    Fallback "Diffuse"
}

2.逐像素漫反射光照

Shader "Unity Shaders Book/Chapter 6/Diffuse Pixel-Level"{
    Properties{
        _Diffuse("Diffuse",color) = (1,1,1,1)
    }
    SubShader{
        Pass{
            Tags{"LightMode" = "ForwardBase"}
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "Lighting.cginc"
            fixed4 _Diffuse;
            struct a2v{
                float4 vertex:POSITION;
                float3 normal:NORMAL;
            };
            struct v2f{
                float4 pos:SV_POSITION;
                fixed3 worldNormal:TEXCOORD0;
            };

            v2f vert(a2v v){
                v2f o;
                            o.pos=UnityObjectToClipPos(v.vertex);
                        o.worldNormal=mul(v.normal,(float3x3)unity_WorldToObject);
                return o;
            }

            fixed4 frag(v2f i):SV_Target{
                fixed3 ambient=UNITY_LIGHTMODEL_AMBIENT.xyz;
                        fixed3 worldNormal=normalize(i.worldNormal);
                        fixed3 worldLightDir=normalize(_WorldSpaceLightPos0.xyz);
                        fixed3 diffuse=_LightColor0.rgb*_Diffuse.rgb*saturate(dot(worldNormal,worldLightDir));
                        fixed3 color=ambient+diffuse;
                        return fixed4(color,1.0);
            }

            ENDCG
        }
    }

    Fallback "Diffuse"
}

3.半兰伯特光照模型(通过改变点积结果范围,使背光面也可以有一定变化)

    Shader "Unity Shaders Book/Chapter 6/Diffuse Half_Lambert"{
    Properties{
        _Diffuse("Diffuse",color) = (1,1,1,1)
    }
    SubShader{
        Pass{
            Tags{"LightMode" = "ForwardBase"}
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "Lighting.cginc"
            fixed4 _Diffuse;
            struct a2v{
                float4 vertex:POSITION;
                float3 normal:NORMAL;
            };
            struct v2f{
                float4 pos:SV_POSITION;
                fixed3 worldNormal:TEXCOORD0;
                };

            v2f vert(a2v v){
                v2f o;
                        o.pos=UnityObjectToClipPos(v.vertex);
                        o.worldNormal=mul(v.normal,(float3x3)unity_WorldToObject);
                return o;
            }

            fixed4 frag(v2f i):SV_Target{
                fixed3 ambient=UNITY_LIGHTMODEL_AMBIENT.xyz;
                        fixed3 worldNormal=normalize(i.worldNormal);
                        fixed3 worldLightDir=normalize(_WorldSpaceLightPos0.xyz);
                            fixed halfLambert=dot(worldLightDir,worldNormal)*0.5+0.5;
                            fixed3 diffuse=_LightColor0.rgb*_Diffuse.rgb*halfLambert;
                            fixed3 color=ambient+diffuse;
                            return fixed4(color,1.0);
                }

                ENDCG
            }
        }
    
    Fallback "Diffuse"
}
上一篇 下一篇

猜你喜欢

热点阅读