写给xx的简陋计算机图形学(0 w 0)————深度缓存算法 & MSAA

279 阅读1分钟

深度缓存

三角形是最基本的面, 如何将给定的一堆三角形正确地画到屏幕上呢 ?

  1. 画家算法 将所有三角形按照他们的深度排序, 从最深的三角形开始画

IMG_0184.PNG

就像画油画一样, 一层叠着一层.

IMG_0185.PNG

IMG_0186.PNG

IMG_0187.PNG

问题: 无法处理互相穿透的三角形 因为没法根据深度对三角形进行排序, 这种三角形各个点的深度都不同.

IMG_0188.PNG

  1. 深度缓存算法 核心思想: 对于每个三角形中的每个像素点,
  • 如果像素点的深度值比该点记录的深度小, 那么将该点记录的深度以及颜色值更新为当前三角形在该点的深度和颜色值

这样做的好处是与画三角形的顺序无关, 无论以什么顺序去画三角形, 最终总能得到正确的结果

MSAA 多重采样抗锯齿

在上面的算法中, 我们只用了一个像素点的中心去检测该像素是否在三角形内

IMG_0189.PNG

这样会带来锯齿的问题:

IMG_0190.PNG

MSAA, 通过在一个像素内增加更多的采样点去检测该像素点是否在三角形内.

例如, 在一个像素点用 2 * 2 的采样点去检测:

IMG_0191.PNG 这样做的话, 我们还需要对每个像素点内部的采样点也做深度缓存.

同时,一个像素点的颜色可能是多个三角形颜色的综合:

IMG_0192.PNG

只要我们将这些采样点的颜色也加权平均起来, 就能在图像边缘得到一个平滑的过渡.