Lambert 光照模型

漫反射

光线照射到粗糙物体表面,向各个方向等强度地反射光,因此从各个视角出发,物体表面呈现相同的亮度,所看到的物体表面某点的明暗程度不随观测者的位置变化的,这种等同地向各个方向散射的现象称为光的漫反射。

Lambert光照模型

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

Lambert漫反射模型:

简介

Lambert 光照模型,是光源照射到物体时产生的漫反射效果,没有高光。如下图:这个时顶点函数处理后的该光照模型,因此看起来像素不够平滑。

漫反射强度=法线与光线的点积即(N*L),当他们夹角为0时,漫反射强度最大,夹角为90度时,反射强度为0。

float3 diffuseReflection = atten * _LightColor0.xyz *  max(0.0, dot(normalDirection,lightDirection));//反射系数*灯光颜色*漫反射强度;
float3 lightFinal = diffuseReflection + UNITY_LIGHTMODEL_AMBIENT.xyz;//漫反射后与环境光叠加
float4 o.col = float4(lightFinal*_Color.rgb,1.0);//最终的漫反射效果在与模型的材质叠加(颜色,贴图等)

源代码:

 1 Shader "JQM/Lambert"
 2 {
 3     Properties
 4     {
 5         _Color("Color", color) = (1.0,1.0,1.0,1.0)
 6     }
 7     SubShader{
 8         Pass{
 9
10             Tags { "LightMode" = "ForwardBase"}
11
12             CGPROGRAM
13             #pragma vertex vert
14             #pragma fragment frag
15
16             //使用自定义变量
17             uniform float4 _Color;
18
19             //使用Unity定义的变量
20             uniform float4 _LightColor0;
21
22             struct vertexInput{
23                 float4 vertex:POSITION;
24                 float3 normal:NORMAL;
25             };
26
27             struct vertexOutput{
28                 float4 pos:SV_POSITION;
29                 float4 col:COLOR;
30             };
31
32             //顶点程序
33             vertexOutput vert(vertexInput v)
34             {
35                 vertexOutput o;
36
37                 float3 normalDirection = normalize( mul(float4(v.normal,0.0),_World2Object)).xyz;
38                 float3 lightDirection;
39                 float atten = 1.0;
40
41                 lightDirection = normalize(_WorldSpaceLightPos0.xyz);
42
43                 float3 diffuseReflection = atten * _LightColor0.xyz *  max(0.0, dot(normalDirection,lightDirection));
44                 float3 lightFinal = diffuseReflection + UNITY_LIGHTMODEL_AMBIENT.xyz;
45
46                 o.col = float4(lightFinal*_Color.rgb,1.0);
47                 o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
48                 return o;
49             }
50
51             //片段程序
52             float4 frag(vertexOutput i):COLOR
53             {
54                 return i.col;
55             }
56
57             ENDCG
58         }
59     }
60
61 }

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

时间: 2024-10-22 06:34:35

Lambert 光照模型的相关文章

Lambert光照模型

lambert光照模型只考虑环境光和漫反射光的影响. 因此在计算的时候,你只需要知道光源的位置和物体上受光点法线的方向即可,而无需知道视点在哪里. 通常来说,lambert光照的最终颜色为:ambient_color*ambient_factor+diffuse_color*diffuse_factor*Diffuse_intensity 光照强度跟物体表面的受光点到光源防线的向量,与物体表面法线的夹角有关.夹角越小,越亮,反之,越暗. 由Lambert渲染出来的物体表面没有最亮的那一点光斑.

Unity3D Half Lambert光照模型

Half Lambert光照模型 说到Half Lambert ,就不得不说反恐精英了,在制作反恐精英的过程中,为了防止物体的背面光丢失而显得太过平面化,就用了这个称之为half lambert的技术 .但是这个half lambert的光照模型是没有任何特殊物理原理,仅仅是增强玩家视觉的一个简单的光照模型例子. 具体的介绍可以参见Valve的wiki: https://developer.valvesoftware.com/wiki/Half_Lambert 左边是普通的Lambert光照模型

Unity shader教程-第五课:自定义光照模型之Half Lambert模型

本文首发地址:http://98jy.net/article/24 更多文章,请入传送门 ---------------------------------------------- Half Lambert光照模型是Valve公司在制作"半条命"游戏时发明的,用来给在比较暗的区域显示物体.总体来说,该光照模型提高了物体表面的漫反射光.下图是Valve的示例,左手边是Lambert模型,右手边是Half Lambert模型. 使用我们原来的基础的shader,我们把LightingBa

Unity3D ShaderLab 自定义光照模型

接着上一篇BasicMyDiffuse来说,这次要说明的就是自定义的光照模型. 1.>//#pragma surface surf Lambert::这个是默认的光照模型 2.>#pragma surface surf CusDiffuse //自己定义的光照模型CusDiffuse; 3.>在SubShader 中加入光照模型函数: inline float4 LightingCusDiffuse(SurfaceOutput s,fixed3 lightDir,fixed atten)

Unity shader学习之逐像素漫反射光照模型

shader如下: Shader "Custom/Diffuse Fragment-Level" { Properties { _Diffuse ("Diffuse", Color) = (1,1,1,1) } SubShader { Tags { "RenderType"="Opaque" } LOD 100 Pass { Tags { "LightMode"="ForwardBase"

【Unity Shaders】使用CgInclude让你的Shader模块化——创建CgInclude文件存储光照模型

本系列主要參考<Unity Shaders and Effects Cookbook>一书(感谢原书作者),同一时候会加上一点个人理解或拓展. 这里是本书全部的插图. 这里是本书所需的代码和资源(当然你也能够从官网下载). ========================================== 切割线 ========================================== 写在前面 了解内置的CgInclude文件当然非常好,可是假设我们想要创建自己的CgInclu

4种基本光照模型

1.Lambert模型(漫反射) 环境光: Iambdiff = Kd*Ia 其中Ia 表示环境光强度,Kd(0<K<1)为材质对环境光的反射系数,Iambdiff是漫反射体与环境光交互反射的光强. 方向光: Ildiff = Kd * Il * Cos(θ) 其中Il是点光源强度,θ是入射光方向与顶点法线的夹角,称入射角(0<=A<=90°),Ildiff是漫反射体与方向光交互反射的光强,若 N为顶点单位法向量,L表示从顶点指向光源的单位向量(注意顶点指向光源),则Cos(θ)等

Lambert模型

[Lambert模型] 漫反射光的强度近似地服从于Lambert定律,即漫反射光的光强仅与入射光的方向和反射点处表面法向夹角的余弦成正比. 由此可以构造出Lambert漫反射模型:Idiffuse =Id Kd cosθIdiffuse表示物体表面某点的漫反射光强Id为点光源,Kd(0<Kd<1)表示物体表面该点对漫反射光的反射属性 θ是入射光线的方向与物体表面该点处法线N的夹角,或称为入射角(0≤θ≤90°)入射角为零时,说明光线垂直于物体表面,漫反射光强最大:90°时光线与物体表面平行,物

【DirectX11】第八篇 光照模型——漫反射

本系列文章主要翻译和参考自<Real-Time 3D Rendering with DirectX and HLSL>一书(感谢原书作者),同时会加上一点个人理解和拓展,文章中如有错误,欢迎指正. 这里是书中的代码和资源. 本文所有的环境和工具使用都基于之前的文章,如有不明白的地方请先参考本系列之前的几篇文章. 本文索引: 关于灯光 Diffuse Lighting 漫反射光照 1 Directional Lights 平行光 2 Diffuse Lighting Effect Preambl