Visibility / occlusion
场景中远近物体的放置问题:
画家算法:将物体远近关系排好,远的场景先画,再画近处的场景,近处的自然覆盖了远处的。
缺陷:不同物体两两相互覆盖的问题无法解决。
Z-buffering深度缓存
对每个像素进行处理,每个像素记录场景中最近的物体的颜色。
frame buffer:最终结果。
depth buffer(深度图):只存任何一个像素所看到的物体最浅的深度信息。
始终假设相机在原点且我们是从-z方向看过去的,所以物体越近z值越大,越远z值越小
深度:定义为点到摄像机的距离。永远为正,越大代表越远。越小代表越近。深度越小,越黑。深度越大,越白。
实现代码:
该算法与画的顺序无关。如果使用了MSAA进行反走样,则该深度缓存不能只对像素点进行,需要对每一个采样点进行。
Shading着色
lllumination & Shading
着色:对不同的物体运行不同的材质。
着色模型:Blinn-Phong Reflectance Model
n:法线
v:观测方向
I:光照方向
着色≠阴影
漫反射:当一束光线达到某一点后会被均匀反射到不同方向去。
结论:当光线与接受表面的夹角
θ
\theta
θ决定了它接受的能量。
θ
=
l
⃗
⋅
n
⃗
\theta = \vec{l}\cdot\vec{n}
θ=l⋅n
认为点光源在任何一个时刻辐射出的能量都集中在一个球壳上。能量在不同球壳上的大小是一致的。假设在一个单位远的球壳上的单位面积能量为
I
I
I,则在
r
r
r单位远的球壳上的单位面积能量为
I
/
r
2
I/r^2
I/r2
结论:已知点光源、着色点(Shading Point)据点光源的距离,就知道传播到着色点的能量为多少。又已知
l
l
l与
n
n
n的夹角
θ
\theta
θ,即可知被着色点吸收 (准确来说是反射出去) 的光能量。
漫反射计算公式:
m
a
x
max
max的意义:只考虑反射,不考虑折射。
K
d
K_d
Kd:表示着色点吸收能量的效率。1表示完全不吸收,到达的能量被全部反射,0表示所有能力被吸收,没有反射出去的能量。
因为漫反射是均匀反射,所以从不同角度观察的亮度是一致的。