Unity中的基础光照
一、一些基础定义
- 着色:根据材质属性(如漫反射属性等)、光源信息(如光源方向、辐照度等),使用一个等式去计算沿某个观察方向的出射度的过程。这个等式称为光照模型。
- 高光反射:表示物体表面是如何反射光线的
- 漫反射:表示有多少光线会被折射、吸收和散射出表面。
- 将进入摄像机的光线分为4个部分(C为符号,后面的小写单词为下标):
- 自发光(emissive)部分:用Cmissive来表示。用于描述当给定一个方向时,一个表面本身会向该方向发射多少辐射量。需要注意的是,如果没有使用全局光照(global illumination)技术,这些自发光的表面并不会真的照亮周围的物体,而是它本身看起来更亮了而已。
- 高光反射(specular)部分:用Cspecular来表示。用于描述当光线从光源照射到模型表面时,该表面会在完全镜面反射方向散射多少辐射量。
- 漫反射(diffuse)部分:用Cdiffuse来表示。用于描述当光线从光源照射到模型表面时,该表面会向每个方向散射多少辐射量。
- 环境光(ambient)部分:用Cambient来表示。用于描述其他所有的间接光照。
- saturate(x) 函数:把x截取在[0,1]范围内,如果x是一个矢量,那么会对它的每一个分量进行这样的操作。x为矢量或者标量,可以是float、float2、float3等类型。
二、基本光照模型中的各个部分的计算公式
1、漫反射部分:Cdiffuse = (Clight * mdiffuse)max(0,n * I)
参数说明:
- Clight:入射光线的颜色和强度
- mdiffuse:材质的漫反射系数
- n:表面法线
- I:光源方向
- max()操作:saturate函数
用于解决背光面全暗的模型,半兰伯特模型:Cdiffuse=(Clight * mdiffuse)(α(n * I)+β)
半兰伯特光照模型没有使用max操作来防止n和I的点积为负值,而是对其结果进行了一个α倍的操作再加上一个β大小的位移。绝大多数情况下,α和β的值均为0.5。所以公式为C**diffuse=(Clight * mdiffuse)(0.5(n * I)+0.5)
通过这样的方式,将***n*** * I的结果范围从[-1,1]映射到[0,1]范围内。
2、高光反射部分:Cspecular=( Clight * mspecular)max(0,v * r)mglass
参数说明:
- Clight:入射光的颜色和强度
- mspecular:材质的高光反射系数
- v:视角方向
- r:反射方向,可以由表面法线**n和光源方向I计算得来:r = 2(n * I)n - I。CG也提供了计算反射方向的函数reflect。reflect(I,n)。
另外一种高光反射模型,Blinn光照模型:Cspecular=(C * mspecular)max(0,n * h)mgloss
- 没有使用反射方向,而是引入一个新的矢量***h***,通过对视角方向**V和光照方向I相加后再归一化得到的。h = (v + I)/|v+I|。