消隐算法
若将可见与不可见的线段全部绘制, 将造成多义性, 无法准确判断物体的空间位置.
消隐的分类
按消隐对象分类
- 线消隐: 消隐对象是物体的边.
- 面消隐: 消隐对象是物体的面.
按消隐空间分类
- 物体空间的消隐: 对比空间中的所有物体, 显示可见的部分. 通常用于线框图的消隐.
- 图像空间的消隐: 以屏幕窗口的像素为处理单位, 判断哪个多边形在该像素可见. 是目前消隐算法的主流.
图像空间的消隐算法
画家算法 (Painer's Algorithm)
一个简单的想法, 即先绘制远处的物体再绘制近处的物体. 但实际情况通常没有这么简单, 比如物体之间交错, 无法区分哪个更近 (或远).
Z-Buffer 算法
别称: 深度缓冲器算法, Z-Buffer Visibility Tests.
背景: 由犹他大学学生 Edwin Catmull 独立开发.
该算法的思想和画家算法相似, 不过处理的粒度为像素, 因此避免了画家算法的缺陷.
优点:
- 简单, 直观.
缺点:
- 效率低下: 遍历所有像素, 检测与多边形的交点, 而求交的运算比较昂贵.
- 内存占用大.
假设 z 永远为正数, 可得:
std::vector<std::size_t> zbuffer(framebuffer.getSize().area());
std::fill(zbuffer.begin(), zbuffer.end(), std::numeric_limits<std::size_t>::max());
for(const auto& t : triangles)
{
for(const auto& [x, y, z] : t)
{
if(z < zbuffer[x][y])
{
framebuffer[x][y] = sample(t, {x, y, z});
zbuffer[x][y] = z;
}
}
}