Lambert/Diffuse 光照模型
Lambert/Diffuse光照模型的特点:各向同性,即与观察的方向无关,反射光只与入射光和入射角度相关。
1.光源垂直照射平面

如图,设入射光量为Ф, 平面面积为A, 则可以认为平面上每一点获取的光量为 Ф/A
2.光源斜射平面, 与平面法线N成角度θ

如图,设入射光量为Ф,光线与法线的交角为θ, 光源的横截面的宽度为L,受光面的宽度为L',则有 L/L' = cosθ.相对于垂直照射,斜照的时候,受光面更大了,光就更分散了,平均每一点获取到的光量就变小了,只有垂直照射的百分之cosθ. 由于cos0° = 1, 两种情况可以统一在一起。另外, cosθ的数值会存在小于0的情况,所以光照模型在实现时一般会取 max(0, cosθ)值。
3.Lambert/Diffuse 的 Unity Shader 实现。
(Unity5.3.4)Shader代码:
Shader "Custom/SimpleDiffuse"
{
Properties
{
[NoScaleOffset]_MainTex ("Texture", 2D) = "white" {}
}
SubShader
{
LOD Pass
{
// indicate that our pass is the "base" pass in forward
// rendering pipeline. It gets ambient and main directional
// light data set up; light direction in _WorldSpaceLightPos0
// and color in _LightColor0
Tags{ "LightMode"="ForwardBase" } CGPROGRAM
#pragma vertex vert
#pragma fragment frag #include "UnityCG.cginc"
#include "UnityLightingCommon.cginc" //for _LightColor0 struct v2f
{
float2 uv : TEXCOORD0;
float4 diff: COLOR0;
float4 vertex : SV_POSITION;
}; sampler2D _MainTex;
float4 _MainTex_ST; v2f vert (appdata_base v)
{
v2f o; o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
o.uv = v.texcoord; half3 worldNormal = UnityObjectToWorldNormal(v.normal); half diffuse = max(, dot(worldNormal, _WorldSpaceLightPos0.xyz));//calculate cosθ o.diff = diffuse * _LightColor0 ;//diffuse return o;
} fixed4 frag (v2f i) : SV_Target
{
// sample the texture
fixed4 col = tex2D(_MainTex, i.uv); col *= i.diff; return col;
} ENDCG
}
}
}
此Shader是Vertex/Fragment Shader而不是SurfaceShader,因为涉及到与光源交互,需要包含UnityLightingComming.cginc文件(第24行代码)。 Tags{ "LightMode"="ForwardBase" } (第17行代码)的目的是声明使用的是Forward Rendering Path, 并且LightMode是ForwardBase,这意味着如果你场景有Directional Light的话,Unity的ShaderLab会把它的位置和颜色和_WorldSpaceLightPos0与_LightColor0这个两个内置变量关联起来,提供给Shader代码引用。所以如果你的场景中并没有Direction Light的话,而是只有Spot Light或者是只有Area Light甚至没有任何光源的话,下图中的猩猩表面会是一片黑,不会有现在这种带毛发效果的图像。(http://docs.unity3d.com/Manual/RenderTech-ForwardRendering.html是关于Forward Rendering的介绍)。
效果图:

4.Half Lambert (主要作用是“让较暗的地方看起来不会过于太暗”)
half diffuse = max(0, dot(worldNormal, _WorldSpaceLightPos0.xyz));
这里得到的diffuse范围在0~1,而且很时候存在很多点的diffuse值很小、很接近0,反映在画面的话就是模型存在局部地方很暗。
Half Lambert 将diffuse的值映射到0.5~1.0,从而将较暗的地方亮度提高。 代码:diffuse = diffuse * 0.5f + 0.5f;
效果:左边的是Half Lambert,相对右图整体会亮一点,更主要的是猩猩的臀部和胸口不会显得特别暗,更接近真实。 5.Lambert/Diffuse 优点:简单高效,比较适合“建筑物”一类的物体材质。缺点:无高光,没有考虑环境光,不适合带镜面反射的物体材质。
Lambert/Diffuse 光照模型的更多相关文章
- Unity3D ShaderLab Half Lambert光照模型
Half Lambert光照模型 说到Half Lambert ,就不得不说反恐精英了,在制作反恐精英的过程中,为了防止物体的背面光丢失而显得太过平面化,就用了这个称之为half lambert的技术 ...
- 【Unity Shader】(三) ------ 光照模型原理及漫反射和高光反射的实现
[Unity Shader](三) ---------------- 光照模型原理及漫反射和高光反射的实现 [Unity Shader](四) ------ 纹理之法线纹理.单张纹理及遮罩纹理的实现 ...
- Lambert漫反射.BLinnPhong及Phong模型 Unity自带的在Lighting.cginc里
1.漫反射 此模型属于经验模型,主要用来简单模拟粗糙物体表面的光照现象 此模型假设物体表面为理想漫反射体(也就是只产生漫反射现象,也成为Lambert反射体),同时,场景中存在两种光,一种为环境光,一 ...
- 转 猫都能学会的Unity3D Shader入门指南(二)
猫都能学会的Unity3D Shader入门指南(二) 关于本系列 这是Unity3D Shader入门指南系列的第二篇,本系列面向的对象是新接触Shader开发的Unity3D使用者,因为我本身自己 ...
- Unity3D Shader入门指南(二)
关于本系列 这是Unity3D Shader入门指南系列的第二篇,本系列面向的对象是新接触Shader开发的Unity3D使用者,因为我本身自己也是Shader初学者,因此可能会存在错误或者疏漏,如果 ...
- UnityShader 表面着色器简单例程集合
0.前言 这些简单的shader程序都是写于2015年的暑假.当时实验室空调坏了,30多个人在实验室中挥汗如雨,闷热中学习shader的日子还历历在目.这些文章闲置在我个人博客中,一年将过,师弟也到了 ...
- Unity中的基础光照
渲染包含了两大部分:决定一个像素的可见性,决定这个像素上的光照计算. 光照模型就是用于决定在一个像素上进行怎样的光照计算. 一.光源 在实时渲染中我们通常把光源当做一个没有体积的点. 1.1 辐照度 ...
- Unity shader 官网文档全方位学习(一)
转载:https://my.oschina.net/u/138823/blog/181131 摘要: 这篇文章主要介绍Surface Shaders基础及Examples详尽解析 What?? Sha ...
- 猫都能学会的Unity3D Shader入门指南(二)
关于本系列 这是Unity3D Shader入门指南系列的第二篇,本系列面向的对象是新接触Shader开发的Unity3D使用者,因为我本身自己也是Shader初学者,因此可能会存在错误或者疏漏,如果 ...
随机推荐
- Firefox OS简单介绍
Firefox OS系统架构框图 一些Firefox相关的术语简单介绍: B2G Boot to Gecko 的简称. Boot to Gecko Firefox OS 操作系统的project代号. ...
- OS - 线程和进程的差别
进程是资源分配的基本单位,又是调度执行的基本单位.比如.用户执行自己的程序,系统就创建一个进程.并为它分配资源,包含各种表.内存空间.磁盘空间.I/O设备等. 然后.把该进程放入进程的就绪队列.进程调 ...
- cmd 下命令
tasklist 查看当前进程 taskkill /? 查看taskkill 的帮助信息 详情 cmd /? 查看cmd详情 color /? 查看颜色详情 比如 color 2 md d:\ji ...
- Android自己定义矩形及selector、shape的使用
[声明]转载请注明出处.此文出自指尖飞落的博客:http://blog.csdn.net/huntersnail --每天写一篇博客.每天做一点技术积累! Android自己定义矩形及selector ...
- 闲来无事爬了下通讯录 试手 jsdom
curl http://xxx.com/address/addresslist\?search\=%40 --cookie oa_cookie=123 -s| node parss .js js 代码 ...
- windows+ubuntu双系统,在windows中访问ubuntu文件
今天被告知ubuntu磁盘空间不足,百度得知可以通过autoremove命令清理,然而,,再也进不去ubuntu系统了,具体表现为第一次选择ubuntu之后一直是空白紫屏,如果强制关机再开机后选择ub ...
- bzoj1816: [Cqoi2010]扑克牌(二分答案判断)
1816: [Cqoi2010]扑克牌 题目:传送门 题解: 被一道毒瘤题搞残了...弃了坑来刷刷水题 一开始还想复杂了...结果发现二分水过: 二分答案...然后check一下,joker肯定尽量用 ...
- http协议无状态中的 "状态" 到底指的是什么?!(转载)
转载自:https://www.cnblogs.com/bellkosmos/p/5237146.html 引子: 最近在好好了解http,发现对介绍http的第一句话[http协议是无状态的,无 ...
- (转载)10个实用的但偏执的Java编程技术
10个实用的但偏执的Java编程技术 在沉浸于编码一段时间以后(比如说我已经投入近20年左右的时间在程序上了),你会渐渐对这些东西习以为常.因为,你知道的…… 作者:小峰来源:码农网|2015-09- ...
- About CNN(convolutional neural network)
NO.1卷积神经网络基本概念 CNN是第一个被成功训练的多层深度神经网络结构,具有较强的容错.自学习及并行处理能力.最初是为识别二维图像而设计的多层感知器,局部连接和权值共享网络结构 类似于生物神经网 ...

左边的是Half Lambert,相对右图整体会亮一点,更主要的是猩猩的臀部和胸口不会显得特别暗,更接近真实。
5.Lambert/Diffuse 优点:简单高效,比较适合“建筑物”一类的物体材质。缺点:无高光,没有考虑环境光,不适合带镜面反射的物体材质。