GAMES101-07- Shading着色1(illumination,Shading)
Shading 1(illumination,Shading and Graphics Pipeline)
Visibility/occlusion可见性/遮挡
场景中当然可能会有多个物体,想要把物体放在屏幕上自然涉及顺序的问题,出现近的遮挡远的情况,这该怎么处理表示呢?
答:对这个问题最直观的解决方法,就是从远到近的处理,先将远处的物体放在屏幕上,再逐渐将近处的物体放在屏幕上,且遮挡住远处的物体。
画家算法
画家算法的思想,跟上面问题的回答的思想类似,即先画远处物体,再画近处的。
一定程度上,画家算法是可行的,根据深度,从远到近进行排序,一一放在屏幕上。那么如果有n个三角形,一一光栅化排序的时间复杂度就为O(nlogn)。
但对下图这个情况,P,Q,R存在互相遮挡的关系,画家算法就很难判断远近。

Z-Buffer
Z-Buffer不对物体排序,而对每个像素进行排序。
针对每个像素记录存储两个缓存值:
一是该像素对应的最近的3D物体的颜色值,即帧缓存(frame buffer),存储每个像素对应的颜色信息。
二是该像素对应的3D物体的最小的Z轴坐标值,即深度缓存(depth buffer),存储每个像素的深度信息。
之前始终假设相机位于原点,且朝着Z轴负方向,所以离相机越近,Z轴坐标越大,反之越小。
这里为了方便起见(仅讨论深度问题),所以假设Z值永远是正数,即Z越小,表示越近,反之越远。
下图右边就是深度缓存,越近颜色值越小,即颜色越深。

Z-Buffer算法
Initialize depth buffer to ∞//深度初始化都是无限远的
During rasterization:
for (each triangle T)
for (each sample(x,y,z)in T)//任意三角形上任意覆盖的像素
if(z<zbuffer[x,y])//当该像素的深度比当前缓存的深度还小,说明更近
framebuffer[x,y]=rgb;//update color
zbuffer[x,y]=z;//update depth
else//当该像素的深度比当前缓存的深度远,不作变化
......//do nothing,this sample is occluded
以下图为例,加深对算法的理解(R表示无限远,数字越大表示越远,数字越小表示越近):

假设一个三角形覆盖常数个像素,那么Z-Buffer算法的复杂度是多少呢?
答:一个一个三角形放上屏幕,实际上就是常数*三角形个数。那么对于n个三角形来说,Z-Buffer的复杂度是O(n)。(注意这里没有排序,只是始终更新每个像素的深度最小值)
如果改变上图中图片的顺序,结果会变吗?
答:不会。这是Z-Buffer好的特性——与顺序无关。
illumination&Shading着色
Review
先回顾以下前面的变换过程:

- 模型变换(Model Transformation):先把机器人摆成要的某种pose,摄像机也放在真实世界某个位置。
- 视图变换 (View Transformation):把相机始终放在(0,0,0)位置,然后计算物体相对于相机的坐标位置。(其实相机拍的是机器人正面,为了方便理解才没有把机器人侧着画)
- 3D位置信息确定好了之后,需要做投影变换,即把3D映射到2D。
- 得到2D位置信息后做光栅化,即确定具体的像素位置。
在得到了帧缓存后,如果把每个颜色复制到像素上,得到的效果如下图,很不真实:

还需要给物体着色,才能得到下图的好的效果:

Shading
定义

在这节课,我们就简单把对某一物体应用不同材质的过程叫作着色。
A simple Shading Model(Blinn-Phong Reflectance Model)

模型主要组成:
- Specular highlights:镜面高光。当光打在一个表面光滑的物体上时,就会产生镜面反射。
- Diffuse reflection:漫反射。像墙这一类表面粗糙的物体,光打在它们身上是会朝四面八方反射。
- Ambient lighting:环境光。人之所以看得见物体是因为物体把光反射到了我们的眼睛。那为什么能看到最下面的那个绿色杯子的背面呢?就是因为环境光的原因,简单理解就是,右上角的光源打在墙上,然后通过漫反射又把光打在了桌子和绿色杯子的背面,所以我们就看得见了。简单理解环境光就是二次光。
局部着色点

对于一个极小的局部来说,可以近似看作是一个平面。当光打在平面上自然会出现反射。
上图中的要素定义如下:
- 观测方向:着色点到相机的方向,\(\vec v\)。
- 表面法向:着色点的法向量,\(\vec n\)。
- 光照方向:着色点到光源的方向,\(\vec l\)。
- 表面参数:color,shininess等。
下图给出了着色的一个示例图,可以看到物体的明暗都画出来了,但是可以看到,一些应该有阴影的区域(下图中鼠标所在位置)没有被画出来,这是因为我们考虑着色,也就是光线来的方向,不考虑光线是否被挡住。
这也就体现了着色的局部性。(shading$\neq $shadow)

Diffuse Reflection漫反射

回顾前面的立方体,为什么同样的光,以同样的角度照射,得到的物体表面的明暗会不一样呢?
答:
为了方便理解,假设光是离散分布的。左图,对于平放的物体,一共有6条光线打在上面。而物体旋转后(中间),此时该表面只接收了三条光线,所以该物体表面肯定要暗一些。仔细观察可以知道,物体表面的亮度应该与一个夹脚有关系,即法线\(\vec n\)和光线\(\vec l\)夹角,$c o s θ = \vec l ⋅\vec n $。
也可以从另一个角度来理解:考虑光是能量,那么对于左图此时由于光线垂直该表面,所以单位面积接收到的能量是最多的,而旋转一定角度后,很显然单位面积接收到的光线能量就变小了,所以对应地,旋转后的表面的亮度就会暗一些。
Lamber’s cosine law 朗伯余弦定律
朗伯余弦定律定义了平面接收到的能量与光照方向\(\vec l\)和法线方向\(\vec n\)夹角的余弦是成正比的。也就是定义了平面接收光能量的多少。

Light Falloff光衰减

中心点是光源,考虑在真空中,光在传播过程中能量没有损失,也就是说以该光源为球心的各个球面上能量都是一样的。
假设半径为\(r\)的球面的能量是\(E\)。由于假设光在传播过程总能量没有损失,所以\(r\)无论取什么值,其所对应的球面的能量都为\(E\)。
具体分析某一个点——假设半径为1的球面上的某一个点的能量是\(I\),那么就由$E = 4 π × 1^2 × I = 4 π I \(。同理,对于半径为\)r\(的球面上的某一个点,该点的能量应为\)E / ( 4 π r^2 ) = I / r^2 $。由此可知,所有球面的能量虽然是相等的,但是每个点的能量却是不同的,具体来说是衰减的,这也叫做Light Falloff。
说到这,我们知道了在某着色点处会有多少光到达,又知道了该着色点会接收多少光能量,那么就可以得到diffuse的公式。
着色点光亮计算公式

\(k_d(I/r^2)\)表示达到着色点的光能量;\(max(0,\vec n \cdot \vec l)\)表示着色点接收的光能量。
-
\(k_d\) 指漫反射系数(diffuse coefficient),也叫Diffusivity。
从微观角度看,再平直的表面都存在凹凸不平,因此就存在光向四周漫射的现象。向四周漫射的光通量与总的反射光通量之比称为:漫射系数或漫反射系数。这个与物体材质有关。
漫反射系数,代表颜色信息。物体之所以有颜色,是因为它吸收了部分光,反射了剩余的光。比如黑色就是把所有光的吸收了,没有光被反射,因此是黑色。又比光照在橘子上,橘子吸收了除橙色以外的光,因此最后橙色的光反射到人眼,所以橘子看起来就是橙色的了。很显然,吸收的光越多,那么能量就越大,不同能量也就对应了不同颜色的光,所以说这个系数可以指代颜色。
具体来说:
如果\(k_d\)是一个标量,那就应该表示明暗(黑白,比如\(k_d\)若为1,表示该平面完全不吸收能量,到达着色点多少能量就反射多少能量。若为0,表示所有能量都被吸收,没有能量反射出去。);
**如果是一个三通道RGB的向量,那么就可以表示具体的颜色了。 **
-
\(I / r^2\): 表示理论上到达每个着色点的光强度(\(I\)表示半径为1的球面上的某一个点的能量,\(r\)表示光能量到着色点的距离);
-
$m a x ( 0 , \vec n ⋅ \vec l ) $:为什么要取最大值呢?因为前面提到了,单位面积接受到光的能量与法线方向和光照方向夹角有关。(一般认为如果夹角的绝对值大于90°时没有意义,就好像光线是从下方打过来的,此时该着色点被其他的点遮住了,故若夹角大于90°,则认为该点能量强度为0。)
下图给出了光源处在不同位置时观测到的球面明暗程度的变化。以最右边那个为例,可以知道光源应该是左上方,照射到球面后,左上角球面的法线方向和光线方向夹角θ很小,所以看起来明亮一些;而考虑侧面,其法线方向与光照方向夹角θ达到90°,甚至超过90°后,基本上就变成黑色了。
而\(k_d\)这个漫反射系数,就是决定了图整体的明亮情况。从下图可知,从左到右,\(k_d\)逐渐变大,图整体逐渐变亮。

可以总结出,在光源位置不变的情况下,物体表面的颜色或敏感程度与观测点位置无关,与漫反射系数\(k_d\)、法线方向与光照方向的夹角θ相关。这与现实生活是相符的。比如你看月亮,它的表面亮度不会随着你的移动而发生改变,相反它只与太阳光的方向以及法线方向有关。

浙公网安备 33010602011771号