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-现代计算机图形学入门