03 - 可见性

可见性

画家算法

学习油画家的经验,光栅化顺序从远到近,层层覆盖。需要对光栅化的三角形深度进行排序(通常是O(nlogn))。

但也有特例,有时候搞不清楚谁覆盖谁(深度关系里有个环):

这样就不能用画家算法了。

深度缓存(Z-buffer)算法

为了简化计算,这里断言Z总是正的(之前变换的时候是负的)

存储当前每个像素的最小z值,按顺序光栅化。最后会同步产出两个图,即Frame Buffer渲染成品图,Depth Buffer/Z-Buffer深度图:

怎么看深度图,越近越白(深度浅),越远越黑(深度深)。

算法伪代码:

// 假设刚开始深度都是无穷远的
// 光栅化过程中:
for (each triangle T)
    for (each sample(x, y, z) in T)
        if (z < zbuffer[x, y])		// 当前像素的z可以覆盖之前的
            framebuffer[x, y] = rgb;// 更新像素rgb
			zbuffer[x, y] = z;		// 更新像素深度
		else
            ;						// 不能覆盖,什么都不做

例子:

参考资料

  • GAMES101-现代计算机图形学入门