跳转至

消隐算法

若将可见与不可见的线段全部绘制, 将造成多义性, 无法准确判断物体的空间位置.

消隐的分类

按消隐对象分类

  • 线消隐: 消隐对象是物体的边.
  • 面消隐: 消隐对象是物体的面.

按消隐空间分类

  • 物体空间的消隐: 对比空间中的所有物体, 显示可见的部分. 通常用于线框图的消隐.
  • 图像空间的消隐: 以屏幕窗口的像素为处理单位, 判断哪个多边形在该像素可见. 是目前消隐算法的主流.

图像空间的消隐算法

画家算法 (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;
    }
  }
}

扫描线算法

Warnock 算法

评论