UnityShader快速入门(3)标准光照模型-理论篇
1. 简介
虽然光照模型有很多种类,但在早期的游戏引擎中往往只使用一个光照模型,这个模型被称为标准光照模型。
在1975年,著名学者裴祥风(Bui Tuong Phong) 提出了标准光照模型背后的基本理念。
标准光照模型只关心直接光照(directlight),也就是那些直接从光源发射出来照射到物体表面后,经过物体表面的一次反射直接进入摄像机的光线。
它的基本方法是,把进入到摄像机内的光线分为4个部分,每个部分使用一种方法来计算它的贡献度。
这4个部分是:
-
自发光 (emissive)
这个部分用于描述当给定一个方向时,一个表面本身会向该方向发射多少辐射量。
需要注意的是:
如果没有使用全局光照(globalillumination)技术,这些自发光的表面并不会真的照亮周围的物体,而是它本身看起来更亮了而已。 -
高光反射(specular)
这个部分用于描述当光线从光源照射到模型表面时,该表面会在完全镜面反射方向散射多少辐射量。 -
漫反射(diffuse)
这个部分用于描述,当光线从光源照射到模型表面时,该表面会向每个方向散射多少辐射量。 -
环境光 (ambient)
它用于描述其他所有的间接光照。
标准光照模型仅仅是一个经验模型,它并不完全符合真实世界中的光照现象。
但由于它的易用性、计算速度和得到的效果都比较好,因此仍然被广泛使用。
但这种模型有很多局限性。
- 有很多重要的物理现象无法用Blinn-Phong模型表现出来,
例如菲涅耳反射(Fresnel reflection)。 - Blinn-Phong 模型是各项同性(isotropic) 的
当我们固定视角和光源方向旋转这个表面时,反射不会发生任何改变。
但有些表面是具有各向异性(anisotropic)反射性质的例如拉丝金属、毛发等。
所以它看起来不够真实
2. 环境光
虽然标准光照模型的重点在于描述直接光照,但在真实的世界中,物体也可以被间接光照(indirect light)所照亮。
间接光照指:光线通常会在多个物体之间反射,最后进入摄像机。
也就是说,在光线进入摄像机之前,经过了不止一次的物体反射。
例如:
在红地毯上放置一个浅灰色的沙发,那么沙发底部也会有红色,这些红色是由红地毯反射了一部分光线,再反弹到沙发上的。
在标准光照模型中,我们使用了一种被称为环境光的部分来近似模拟间接光照。
环境光的计算非常简单,它通常是一个 全局变量,即场景中的所有物体都使用这个环境光。
环境光计算公式:
c a m b i e n t = g a m b i e n t c_{ambient}=g_{ambient} cambient=gambient
物体环境光=全局环境光
3. 自发光
光线也可以直接由光源发射进入摄像机,而不需要经过任何物体的反射。
标准光照模型使用自发光来计算这个部分的贡献度。
它的计算也很简单,就是直接使用了该材质的自发光颜色:
自发光计算公式:
c e m i s s i v e = m e m i s s i v e c_{emissive}=m_{emissive} cemissive=memissive
物体自发光=该物体材质自发光
通常在实时渲染中,自发光的表面往往并不会照亮周围的表面
也就是说,这个物体并不会被当成一个光源。
Unity5引入的全新的全局光照系统则可以模拟这类自发光物体对周围物体的影响
4. 漫反射
漫反射光照是用于对那些被物体表面随机散射到各个方向的辐射度进行建模的。
在漫反射中,视角的位置是不重要的,因为反射是完全随机的,因此可以认为在任何反射方向上的分布都是一样的。但是,入射光线的角度很重要。
漫反射光照符合兰伯特定律(Lambert’s law):
反射光线的强度与表面法线和光源方向之间夹角的余弦值成正比。
漫反射计算公式:
c d i f f u s e = ( c l i g h t ⋅ m d i f f u s e ) m a x ( 0 , n ⋅ I ) c_{diffuse}=(c_{light}·m_{diffuse})max(0,n·I) cdiffuse=(c