如何看到这个世界的
如何产生一个图像:
- 光线从光源(light source)中被发射出来
- 光线和场景中的一些物体相交;一些被物体吸收了,而另一些光线被散射到其他方向。
- 眼睛(摄像机)吸收到一些光,产生了一张图像。
光线和物体相交只有两个结果,吸收和散射:
- 散射只改变光的方向,但不改变光的密度和颜色
- 吸收只改变光线的密度和颜色,但不改变光线的方向
散射的方向:
- 一种会散射到物体内部,称为折射或者透射(refraction/transmission)
- 一种散射到物体外部,称为反射(reflection)
不同的散射方向在光照模型中使用不同的部分来计算:
- 高光反射(specular)部分表示物体表面是如何反射光线的
- 漫反射(diffuse)部分表示有多少光线会被折射、吸收和散射出表面的。
辐照度和出射度:
- 辐照度用于量化光(一个光源发出了多少光)
- 出射度用于描述出射光线的数量和方向
着色(shading):
- 根据材质属性(如漫反射属性)、光源信息(光源方向、辐照度),使用等式去计算沿着某个观察方向的出射度的过程,这个等式就是光照模型(Light Model)。
BRDF光照模型(Bidirectional Reflectance Distribution Function):
- 该模型对真是场景进行理想化和简化后的模型,也称为经验模型,其用于解释:当光线从某个方向照射到一个表面时,有多少光线被反射,反射的方向有哪些。
标准光照模型
标准光照模型早于BRDF光照模型。标准光照模型只关心直接光照(direct light),也就是那些直接从光源发射出来照射到物体表面后经过物体表面的一次反射直接进入摄像机的光线。
基本光照模型的基本上发是将进入眼睛(摄像机)的光线分为4个部分:
- 自发光(emissive)部分,该部分用于描述当给定一个方向时,一个表面本身会向该方向发射多少辐射量。
- 高光反射(specular)部分,该部分用于描述当光线从光源照射到模型表面时,该表面会在完全镜面反射方向散射多少辐射量。
- 漫反射(diffuse)部分,该部分用于描述当光线从光源照射到模型表面时,该表面会在每个方向散射多少辐射量。
- 环境光(ambient)部分,该部分用于描述当其他所有的间接光照。
环境光
间接光照:
- 光线通常会在多个物体之间反射,最后进入眼睛(摄像机)
环境光:
- 标准光照模型使用环境光来模拟间接光照。
- 环境光是一个全局变量,场景内的所有物体都使用同一个环境光。
- 计算等式:
Cambient=gambient
自发光
光照也可以不经过反射直接进入到眼睛(摄像机)。
自发光:
- 标准光照模型使用自发光来计算这部分光照。
-
Cemissive=memissive(直接使用材质的自发光颜色)
漫反射
漫反射光照:
- 是对被物体表面随机散射到各个方向的辐射度进行建模的。
- 视角位置不重要,入射光线角度很重要。
- 漫反射符合兰伯特定律(Lambert’s law):反射光线的强度与表面法线和光源方向之间夹角的余弦值成正比。
-
cdiffuse=(clight∗mdiffuse)max(0,n^∗l^)
- n^ 是表面法线, l^ 是光源的单位矢量, mdiffuse 是材质的漫反射颜色, clight 是光源颜色
高光反射
高光反射:
- 高光反射是一个经验模型。
- 它用于计算那些沿着完全镜面反射方向被反射的光线,可以让物体看起来更有光泽(金属材质)。
- 计算高光反射需要知道:表面法线 n^ ,视角方向 v^ ,光源方向 l^ ,反射方向 r^ 等。
反射方向可以由其他信息计算:
r^=2(n^∗l^)n^−l^
Cspecular=(Clightmspecularmax(0,v^∗r^)mgloss
mgloss 是材质的光泽度(gloss),也称为反光度(shininess),用于控制高光区域的亮点有多大, mgloss 越大,光点越小。 mspecular 是材质的高光反射颜色,用于控制该材质对高光反射的强度与颜色。 clight 则是光源的强度。
在何处计算这些光照模型:
- 在片元着色器中计算,称为逐像素光照(per-pixel lighting)
- 在顶点着色器中计算,称为逐顶点光照(per-vertex lighting)
Unity中的环境光和自发光
环境光:
- 通过Unity内置变量
UNITY_LIGHTMODEL_AMBIENT
就可以得到环境光的颜色和强度
自发光:
- 在片元着色器最后输出颜色浅,把材质的自发光颜色加到输出颜色上即可。