美文网首页
光照模型-漫反射兰伯特定律 _01

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

作者: Rayson | 来源:发表于2020-06-02 17:29 被阅读0次

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

  • 散射与吸收。散射到物体内部的现象被称为折射或散射,而散射到物体外部的现象称为反射;其余部分则被吸收。
  • 散射不改变光线密度和颜色,只会改变方向;而吸收不改变方向,只会改变密度和颜色。
  • 漫反射兰伯特定律计算如下:



  • 顶点漫反射光照
    1.逐顶点漫反射光照
    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"
}

相关文章

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

    光源与物体表面相交只会有两个结果: 散射与吸收。散射到物体内部的现象被称为折射或散射,而散射到物体外部的现象称为反...

  • 光照模型

    漫反射 (兰伯特光照模型): Cdiffuse= Clight * Mdiffuse * max(0,(n*l))...

  • 光照模型

    漫反射模型 Lambert光照模型 : 漫反射=光照颜色 * max(0,cos(光照方向•模型法线方向)) di...

  • Phong、Blinn-Phong光照模型介绍

    上次介绍了兰伯特、半兰伯特光照模型及其实现,这次介绍一个进阶一点的光照模型--Phong光照模型。简单来讲,Pho...

  • LearnOpenGL 基础光照

    光照-冯氏光照模型 环境 ambient 漫反射 diffuse 镜面反射 specular 环境光照(Ambie...

  • Unity Shader 入门(六)镜面高光

    简介 之前在讲自定义光照模型时,提到Lambert漫反射光照模型,这是一个用来模拟粗糙表面对光线的漫反射现象的经验...

  • OpenGL ES 光照计算

    冯氏光照模型:主要结构由3个元素组成:环境(Ambient)光照、漫反射(Diffuse)光照和镜面(Specul...

  • OpenGL ES(五) 光照

    在OpenGL ES中光照模型主要结构由3个元素组成:环境(Ambient)光照、漫反射(Diffuse)光照和镜...

  • 8.opengl光照-材质

    一、理论介绍 按照冯氏光照模型,ambient(环境光)、diffuse(漫反射)、specular(镜面反射)、...

  • 三、效果实现:ShaderForge实现半兰伯特和卡通效果

    一、半兰伯特效果图: 思路:(1)法线方向和光方向进行点积,得到-1到-1的值,此为兰伯特光照模型(2)0代表暗,...

网友评论

      本文标题:光照模型-漫反射兰伯特定律 _01

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