A-Buffer简介

A-Buffer是一种图形学(渲染方向)上的用于可见面分析(Visble Surface Detection)的技术。

可见面分析最常见的技术有以下三种:

  1. Z-Buffer 算法(或者叫 Depth-Buffer 算法)
  2. Back-Face Detection方法,该方法用于剔除不可见(反方向的)面
  3. A-Buffer 方法,也是本文要介绍的方法。

A-Buffer是Z-Buffer方法是Z-Buffer的衍生方法,因此了解ABuffer有必要回顾一下ZBuffer。

Z-Buffer的缺陷

Z-Buffer是用于剔除 不透明 物体的算法。假设某个像素有A B C三个不透明物体重叠,A在最上面,B在中间,C在最底下,那么Z-Buffer的结果就是A,意味着B、C都被A遮蔽了,因此可以针对该像素点剔除

Z-Buffer是一个用于存储深度信息的算法,其大小与Color Buffer一致,每一个像素对应一个深度信息。Z-Buffer永远存储距离屏幕最近的点的深度信息

算法的伪代码可以表示如下:

Init Z-Buffer as size = sizeof(ColorBuffer), All one initialized# P.S. 0 <= ZBuffer [x,y] <= 1For each object in ObjectsToRender:    if object.pixel.depth < ZBuffer[object.pixel.xy]:        ZBuffer[object.pixel.xy] = object.pixel.depth        render this object    else:        Not to render this object

该算法只适用于不透明物体。因为渲染半透明物体需要各个半透明物体的相对位置信息来正确地颜色混合(Blending)(见半透明渲染部分)。

Z-Buffer 的衍生

虽然Z-Buffer不适用于半透明物体渲染,但是将Z-Buffer稍微做修改就能渲染半透明物体。修改的目的是为了在渲染时保留各个半透明的顺序信息,也即,针对每一个像素而言,需要记录的不仅仅只是一个单一的深度信息,还要记录下该像素关联了哪些图元

这种修改又称为A-Buffer,即Accumulation Buffer, Accumulation 取“累计”之意,意为该Buffer针对每一个像素记录累计的图元信息。

具体实现方法参见:A-Buffer Method from GeeksForGeeks