GAMES101 第6讲 光栅化(深度缓冲)
GAMES101 第6讲 光栅化(深度缓冲)
深度缓冲
画家算法
画家算法(Painter’s Algorithm): 从后往前绘制, 后绘制的像素会覆盖先绘制的像素
例如下图中, 从后往前绘制, 会先绘制远处的山脉, 再绘制草地, 草地会覆盖部分山脉的像素, 然后绘制树木, 树木会覆盖部分草地的像素, 也会覆盖部分山脉的像素:
但是画家算法有一个问题, 如果两个物体互相遮挡, 那么就会出现问题, 如下图所示:
深度缓冲(Z-Buffer)
深度缓冲(Z-Buffer): 为每个像素存储一个深度值, 当绘制一个像素时, 先检查该像素的深度值, 如果新像素的深度值小于深度缓冲中的深度值, 那么就更新深度缓冲中的深度值, 并绘制新像素
- 在渲染过程中, 除了最终得出的结果的图象, 还会生成一个深度图, 用于记录每个像素所看到的几何物体的最浅的深度信息, 这个图象就是深度缓冲, 也叫深度图
- 最终图象叫做Frame Buffer, 深度信息的图象叫做Depth Buffer, 两者同时生成
图形学常常假设相机在原点, 观察方向为 $-z$ 轴, 但是为了我们方便计算, 我们假设 $z$ 的值始终为正值, 即 $z$ 越大, 越远离相机, $z$ 越小, 越靠近相机
深度缓冲的算法如下:
- 初始化深度缓冲, 将所有像素的深度值设为无穷大(无穷远)
- 将所有三角形的像素绘制到深度缓冲中, 每次绘制一个像素时, 检查该像素的深度值
- 如果新像素的深度值小于深度缓冲中的深度值, 那么就更新深度缓冲中的深度值, 并绘制新像素
算法复杂度:
- 假设每个三角形都会覆盖相同的常数个像素
- 时间复杂度: $O(n)$
本文由作者按照 CC BY 4.0 进行授权