深度缓冲

由于画家算法的缺陷,我们常常在3D渲染中碰到错位的情况,因此引入深度缓冲来解决这样的问题。通过深度缓冲来存放场景中点距离照相机的远近,以此来判断当前像素点应该渲染出的颜色。这样渲染器就可以顺序的去处理场景。

算法思路

  • 遍历每一个三角形
    • 遍历三角形中的样本
      • 如果当前深度值小于之前的值
      • 更新样本颜色
      • 更新深度缓存
      • 否则什么都不做

实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 遍历包围盒
for (P.x=bboxmin.x; P.x<=bboxmax.x; P.x++) {
for (P.y=bboxmin.y; P.y<=bboxmax.y; P.y++) {
// 通过重心坐标判断位置
Vec3f bc_screen = barycentric(pts[0], pts[1], pts[2], P);
// 在三角形外就跳过
if (bc_screen.x<0 || bc_screen.y<0 || bc_screen.z<0) continue;
P.z = 0;
// 获取z值
for (int i=0; i<3; i++) P.z += pts[i][2]*bc_screen[i];
// 深度缓存更新
if (zbuffer[int(P.x+P.y*width)]<P.z) {
zbuffer[int(P.x+P.y*width)] = P.z;
image.set(P.x, P.y, color);
}
}
}