第七章:z-buffer和着色
回顾上一课:
光栅化一个三角形
采样
反走样
可见性/遮挡(把三角形画在屏幕上,同时遮挡关系是对的):
- z-buffer
painter’s algorithm(画家算法)
所有物体按深度排序(O(nlogn)),先把远的画上去,再把近的画上去,近的就会遮挡远的。但这种方式无法解决深度上互相遮挡的问题。
z-buffer
通过深度缓存维护存储每个像素当前的最小深度
同步生成最后的结果(frame buffer)和当前看到的场景的任何一个像素对应的深度(depth buffer)。
假设场景的点到相机的距离表示深度z,且这个值始终是正的,z越小的距离越近,越大的距离越远。
先假设深度图上每一个像素的深度都是无限远,遍历每一个三角形的每一个像素,如果遍历到的像素深度比当前深度图记录的深度浅,就把深度图上的深度替换为这个像素的深度,否则不变。
假设每个三角形覆盖的像素是常数项,时间复杂度O(n)。
一般两个浮点数值不会一样,所以比较深度的时候一般不会出现深度一样的情况。
MSAA采样的时候一个像素可能有多个采样点,所以是记录每个采样点的深度。
透明物体处理不了深度。
着色(shading)
对不同物体应用不同的材质。
一个基础的着色模型(Blinn-Phong 反射模型)
高光、漫反射、环境光
对于一个物体表面的点,定义一个法线方向、一个视线方向、一个光照方向,和一些物体表面的参数
着色有局部性。不考虑其他的物体,只考虑自己。
一个shading point周围的单位面积接收的能量和光照方向和发现方向夹角的余弦成正比。
点光源,光线传播,每个时刻到达一个新的球壳。假如半径为1的时候,光的强度为I,则半径为r的时候,强度变为I/r²
从不同的角度观测同一个点的结果是一样的。
k_(d) 漫反射的系数,表示吸收了(反射了)多少颜色颜色。