笔记07-着色(01)
1.光栅化
1.1画家算法
画家算法的操作是从远至进一层一层画,最终将画像完整。
但是,缺点是如果画像没有很明显的逻辑层次,画家算法将不适用。例如下图:
为了解决这个矛盾,于是进行改进发明了 ”Z-Buffer“ 算法。
1.2深度缓存 Z-缓存
简单来说,步骤:
1.通过离相机最近的一点进行深度插值,知道每一个三角形的深度值。
2.利用for循环,计算每个采样点的深度值。(注:不是对每一个像素求Z-Buffer,是对每一个采样点。)
3.一个一个采样点的深度值叠加进行光栅化,只保留当前最小值(最近才可以被看见,远了就被挡住,因此被近的覆盖。)
效果图:
由于需要对采样点进行挨个比较,但是只保留最小值,因此其时间复杂度为O(n)。并且至于采样点(三角形)叠加的顺序并不会影响光栅化效果(因为只保留最小值)
2. 着色(shading)
着色(shading):物体应用不同的材质表现着色过程
高光(Specular highlights):亮度极高,在镜面反射附近方向反射。
漫反射(Diffuse reflection):亮度有变化,光线会反射到四面八方。漫反射到每个方向上是均匀的
环境光照(Ambient lighting):这属于间接光照,其实点光源并不会射到环境光照所指的位置。
2.1着色是局部
定义参数:
观察方向(Viewer direction):v
表面法线(Surface normal):n
光照方向(Light direction):l (适用于多个灯光中的每一个)
表面参数(Surface parameters):颜色、光泽(明暗)
2.2漫反射
A.计算被吸收的能量 - 兰伯特余弦定律
兰伯特余弦定律(Lambert’s cosine law) :
一般来说,表面接收到的能量和光线方向 l与法线方向 n的余弦 cos θ = l * n 成正比
B.光的能量衰减
可以将光照的能量看做一个球壳状的波,根据能量守恒定律,随着波的扩散,球壳表面积变大,球壳单位面积上的能量会衰减(设能量在传播过程中没有发生损失)
公式:
Ld=kd(I/r2)max(0,n*l)
Ld :漫反射的反射光
Kd :漫反射系数,向四周漫射的光通量与总的反射光通量之比
(I/r2) :在着色点处的光的能量(该式根据光的能量衰减模型来获得)
max(0,n*l) : 着色点接收到的光的能量(根据兰伯特余弦定律,特别地,当余弦为负数时,能量为零)