zoukankan      html  css  js  c++  java
  • Lambert (兰伯特)光照模型

    Lambert (兰伯特)光照模型

      是光源照射到物体表面后,向四面八方反射,产生的漫反射效果。这是一种理想的漫反射光照模型。如下图:这个是顶点函数处理后的该光照模型,因此看起来像素不够平滑。

    漫反射

      是投射在粗糙表面上的光向各个方向反射的现象。当一束平行的入射光线射到粗糙的表面时,表面会把光线向着四面八方反射,所以入射线虽然互相平行,由于各点的法线方向不一致,造成反射光线向不同的方向无规则地反射,这种反射称之为“漫反射”或“漫射”。这种反射的光称为漫射光。

    Lambert光照模型计算方法

      漫反射光的强度近似地服从于Lambert定律,即漫反射光的光强仅与入射光的方向和反射点处表面法向夹角的余弦成正比。

      原理公式:diffuse = I*cosθ;

        diffuse:反射光线的的光强;

        I:入射光线的光强,方向如上图所示;

        cosθ:入射光线和该顶点法线的余弦,如上图所示;cosθ = L*N;

      所以,最后的数学表达式为:diffuse = I*(L*N);

    Shader程序

     1 /*******************************************
     2 Lambert(兰伯特)光照模型
     3     1. 理想的漫反射;
     4     2. 计算都在顶点着色器,因此像素不会平滑过渡;
     5 *******************************************/
     6 Shader "JQM/Lambert"
     7 {
     8     Properties
     9     {
    10         _Color("Color", color) = (1.0,1.0,1.0,1.0)
    11     }
    12     SubShader{
    13         Pass{
    14             
    15             Tags { "LightMode" = "ForwardBase"}
    16 
    17             CGPROGRAM
    18             #pragma vertex vert
    19             #pragma fragment frag
    20 
    21             //使用自定义变量
    22             uniform float4 _Color;
    23 
    24             //使用Unity定义的变量
    25             uniform float4 _LightColor0;
    26 
    27             struct vertexInput{
    28                 float4 vertex:POSITION;
    29                 float3 normal:NORMAL;
    30             };
    31 
    32             struct vertexOutput{
    33                 float4 pos:SV_POSITION;
    34                 float4 col:COLOR;
    35             };
    36 
    37             //顶点程序
    38             vertexOutput vert(vertexInput v)
    39             {
    40                 vertexOutput o;
    41                 
    42                 float3 normalDirection = normalize( mul(float4(v.normal,0.0),_World2Object).xyz);//将模型空间的法线转到世界空间
    43                 float3 lightDirection;
    44                 float atten = 1.0;
    45 
    46                 lightDirection = normalize(_WorldSpaceLightPos0.xyz);//灯光方向
    47                 float3 diffuseReflection = atten * _LightColor0.xyz *  max(0.0, dot(normalDirection,lightDirection));//计算兰伯特漫反射
    48                 float3 lightFinal = diffuseReflection + UNITY_LIGHTMODEL_AMBIENT.xyz;//与环境光结合
    49 
    50                 o.col = float4(lightFinal*_Color.rgb,1.0);
    51                 o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
    52                 return o;
    53             }
    54 
    55             //片段程序
    56             float4 frag(vertexOutput i):COLOR
    57             {
    58                 return i.col;
    59             }
    60 
    61             ENDCG
    62         }
    63     }
    64     
    65 }

     效果图

    物体在空间中 受到 光源 环境光 和 自身材质(颜色,贴图) 的综合因素的影响,形成的效果。

  • 相关阅读:
    Axure chrome 安装及已损坏的解决方法
    Ubuntu16.04上使用git
    ubuntu初探
    nginx入门笔记
    更改element-UI按钮默认样式
    js深拷贝与浅拷贝的区别及实现
    安装mysql-python的遇到的问题
    facebook atc弱网环境搭建和踩坑总结
    验证码识别 Tesseract的简单使用和总结
    selenium 基础(一)
  • 原文地址:https://www.cnblogs.com/jqm304775992/p/4887779.html
Copyright © 2011-2022 走看看