一、前台缓存和后台缓存

图像在绘制的时候,一般都不是直接在屏幕上绘制,而是有一个后台离屏缓存(offscreen buffer),在离屏缓存里边绘制好了之后,提交到屏幕,然后我们才看到。一般来讲,后台缓存的尺寸跟绘制窗口的客户区(叫前台缓存-primary buffer)尺寸是一致的。

二、超级采样(supper-sampling) VS 多重采样(mutil-sampling):

在开启了超级采样及多重采样之后,后台缓存会被扩达到前台缓存的四倍,长宽各两倍,也就是说,前台缓存图像的每一个像素的颜色是由后台缓存对应的四个像素的颜色来决定的。

超级采样与多重采样的区别就在于这四个颜色的计算方式不同:

  1. 超级采样(SSAA)会为每一个像素计算颜色,计算四次;
  2. 而多重采样(MSAA)只会计算一次,然后拷贝,至于拷贝几次,要看具体情况,跟遮挡信息有关系。然后提交画面时,将四个颜色求均值。

两者都是把后台缓冲的分辨率调整到屏幕分辨率的4倍,然后4个子像素取平均值决定当前像素的颜色。区别在于,超级采样是分别计算4个子像素的颜色,再取平均值。多重采样是根据像素(注意不是子像素)的中心颜色,决定4个子像素的颜色(这样就不用分别计算4个子像素了),然后再根据子像素的可见度调整。如下图,右下角的子像素本来和像素中心颜色一样是绿色,但由于它未被绿色多边形覆盖,因此它的颜色最终被白色(背景色)替代。有了4个子像素的颜色,最后取平均值,得到下图的右边。

python 超采样 抗锯齿 抗锯齿方法超级采样_缓存


MSAA是把像素扩大N倍,得到N个子采样点,再将扩大成N倍的渲染目标,再经过一个过程缩放成原始的渲染目标,这个过程称为resolve(解析)

再举个例子,如图2所示,你就可以理解为什么输出的颜色是粉色的:

python 超采样 抗锯齿 抗锯齿方法超级采样_渲染管线_02


左图表示没有采用任何AA输出白色,右图采用MSAA输出的粉色。

画面好坏:
综上,超级采样肯定要比多采样好,颜色要更加精确,而多重采样就不那么精确了。但是超级采样的计算量要大大多与多重采样。

三、 direct3d中的资源视图:

纹理等资源可以被绑定到渲染管线的不同阶段,但实际上,用于绑定的不是资源本身,而是与资源关联的资源视图。因此需要先创建资源,再创建资源视图,最后将视图绑定到渲染管线。