光照与雾化
标准光照模型是局部模型中的一种----即当处理一个物体时,不考虑其他物体的影响。物体也不向别的物体投下影子,实际上,物体自身无法生成影子,影子是使用全局光照模型生成的。
色彩的数学
计算机中的色彩常用RGB色彩模型表示,这里R表示红,G表示绿,B表示蓝,其精度因平台与渲染状态而异。我们视RGB为0至1间的值,并且也不考虑其中各分量到底占用多少二进制位。在计算机图形学中,色彩常被视为数学实体。我们用黑体的小写罗马字母表示色彩符号,如c,与向量符号相同,但由于二者上下文不同,所以不会混淆。
可以认为色彩存在于一个3D单位立方体"色彩空间"中,如图15.7所示:
黑、白两色十分重要,分别由RGB(0, 0, 0)和(1, 1,
1)表示,并且用特殊的符号0、1分别标识,灰色都在黑白色之间的那条连线上。
色彩可以加、减、乘以标量,和向量运算一样。两个色彩也可以作"按位乘"运算,运算记作。
色彩运算有时会使一个或多个RGB分量超出[0, 1]的界限(比如,计算光照时,出现极强的光亮),此时简单地加以截断。根据情况,也许在计算中每一步都进行截断,也许中间允许超界,而在最后截断。
如果只有一个分量超界,截断运算可能会引起色彩混乱。比如,色彩(1, 2, 1)其实是(0.5,
1, 0.5)的一个更亮的表示,类似某种绿色。简单地加以截断后,绿色消失只剩余白色。更聪明的办法是除以最大色彩值以单位化。此例中,均除以最大分量值2。当然,开始时就防止越界(比如,调整光强以使越界不发生)才是最好的办法。
光源
为进行渲染,必须向图形API描述场景中的光。下面是一个光源类型的简单列表:
点光源,平行光,聚光灯,环境光。
我们将讨论大多数渲染API都支持的常见光源。
点光源是向四面八方发射光线的单点,又称全向光或球状光。点光源有方向和色彩,此色彩同时表示色调与亮度,点光源还有一个辐射衰减半径,控制照亮的范围。图15.8展示了3DS如何表示点光源。
光强通常由光源中心向辐射前进方向不断衰减,最终为0。点光源可代表许多常见发光物,如灯泡、电灯、火把等。
平行光是从无限远处射来的点光源的光线,场景中所有光线皆为平行的。平行光源没有位置的概念,也无衰减。太阳是平行光的典型代表(目前还不考虑太阳的位置来渲染场景)。
聚光灯指从特定光源向特定方向射出的光,比如信号灯、车头灯等。它们有位置、方向、甚至还有辐射距离的概念,其照亮区域为圆锥形或金字塔形。
圆形聚光灯有一个圆形的"底",其宽度由辐射衰减角给出(注意与辐射衰减距离的区别)。并且,有一个描述高亮区的内角度,如图15.9:
方形聚光灯形成金字塔形状,而不是圆锥形。方形聚光灯非常有趣,因为常被用来投影图像,比如电影放映。
最后,环境光指不属于任何光源而照亮整个场景的光。不考虑环境光,则物体的影子将完全是黑的,因为它们不被任何光源照亮。现实中,这类物体常被间接照亮,环境光是积累这种间接光照最根本的方法。
标准光照方程----概述
光照方程定义了标准光照模型,用于计算单个像素的色彩。标准方程可简写为公式15.7:
Clit = Cspec + Cdiff
+ Camb
公式15.7 标准光照方程
其中,
(1)Clit是打开光照情况下计算颜色值的结果,这与关闭光照(注意:相当于用最强光照照射)情况下计算的结果不同。和我们日常生活中的"光照"一词不同,计算机图形学中的"光照"是指取关闭光照情况下的纹理颜色值进行计算,一般情况下得到的结果比原纹理颜色值暗。
(2)Cspec是镜面反射分量。
(3)Cdiff是散射分量。
(4)Camb是环境分量。
物体外观主要取决于以下四点因素:
(1)物体表面的性质,即材质属性。
(2)表面的方位与朝向,朝向常用单位法向量表示。
(3)照射来的各光源性质。
(4)观察者位置。
方程中的三个组成部分,分别考虑了上述因子的不同组合。