屏幕反走样(screen based antialiasing) 节选自 Realtime Rendering 5.6.2

来源:互联网 发布:丽水领导干部网络学校 编辑:程序博客网 时间:2024/05/16 01:52

这一节看来看去死活看不懂,决定发动翻译大法。。

像supersampling这样的技术是通过独立计算着色、深度、位置来完全指定的。代价昂贵且效果不好。所以,DX并不直接支持supersampling作为反走样。多重采样策略可以降低这种技术的高计算量,通过对不同种类的数据使用不同频率的取样。一个多重采样算法,将在一个单pass内,对单个pixel进行多个采样。简称MSAA。最近还有coverage sampling,CSAA。
当遇到物体边界、镜面高光、尖锐阴影可能会造成尖锐的颜色变化时,需要用到额外的采样。镜面高光可以变宽,尖锐阴影可以变柔软,但是物体边界还是取样的一个主要问题。MSAA通过每fragment计算更少的采样来节省时间。所以一个pixel的每个fragment可能有4个采样点,每一个都有自己的颜色和z,但是每个fragment只计算一次shade。
如果fragment把MSAA的所有取样位置都覆盖了,那么shading的取样是在pixel的中心。但是,如果fragment只覆盖了一部分,那么shading的取样位置可能会移动。这样一来可以避免诸如shade取到贴图的边缘位置。这种位置适应叫做质心采样(centroid sampling)或质心插值(centroid interpolation),是由GPU自动做的,如果激活。不过,质心取样有可能造成导数计算(derivative computations)然后返回错误值,所以要慎用。
MSAA比一个纯supersampling要快,因为每个fragment只被shade一次。它着重于对fragment的pixel覆盖的进行一个较高的取样(sampling)率(higher rate),然后共享shade的计算结果。不过,对每个采样点存储一个实际的存储颜色和深度值通常是不必要的。CSAA看到了这一点,因此仅对在这个较高的采样率 (higher sampling rate) 下,仅存储每个fragment的coverage。每个子像素(subpixel)存储她所关联的fragment的index。每个fragment拥有一个有限长度的表,存储其颜色和z。比如,一个存储了4个颜色和z的表,每个subpixel只需要两个比特的空间就可以定位到这个表中。理论上一个有着16个sample的pixel可以有16个不同的fragment,CSAA就无法合理的存储所需的这些信息了,可能会造成人工感(artifacts)。对于大多数数据结构,shade的pixel里边很少有4个以上的完全不同的fragment,所以这个结构实际中运行得很好。
把shading和depth的存储分开的想法,类似于A-buffer[157, Carpenter],另一个结构的multisampling。这个算法通常只用来生成高质量的渲染,但是无法达到可交互的速度。在A-buffer中,渲染每个多边形时,会对每个屏幕格子(screen grid cell)生成一个coverage mask,代表它是否全部或者局部覆盖。
类似于MSAA,这个多边形的shade只在fragment的中心位置计算一次,被所有sample公用。深度值计算然后存储为某种形式。一些系统计算最大最小深度值,还有一些保存了多边形的倾斜度(slope),从而可以计算每个sample位置的精确深度值,从而允许了相互渗透(interpenetrating)的多边形也能被良好的渲染[614]。覆盖遮罩(coverage mask)、shade、深度值,和其他信息,组成了A-buffer的fragment的存储信息。
A-buffer不同于Z-buffer的一个值得讨论的地方是,一个屏幕格子(screen grid cell)可以同时存储任意数量的fragment。它们收集时,隐藏的fragment可以被扔掉。例如,如果一个不透明fragment A有一个 coverage mask完全覆盖fragment B,并且fragment A的最大深度值小于B的最小深度值。那么B可以安全的被抛弃。coverage mask也可以被合并、用在一起。例如,如果一个不透明物体覆盖了一个像素的其中一部分,而另一个覆盖了另一部分,它们的mask可以被逻辑“or”在一起,它们的最大深度值被用来形成一个更广范围的(coverage)。因为这种合并策略,fragment经常用深度值排序。在这种设计下,当fragment缓存满了的时候,这种合并就可能发生,或者作为shading和显示的最后一个步骤。
一旦所有多边形都被送往了A-buffer,pixel中的颜色就被计算了。方法是,计算每个fragment中mask有多少是可见的,然后用这个比例乘以其颜色,将结果相加。透明效果也在这时候被包括进来,这也是A-buffer的一个长处。
虽然这听起来像是一个有涉及的过程,但是将三角形渲染到Z-buffer的许多机制可以被用在实现A-buffer上。存储和计算的要求都要比简单的FSAA要低许多,因为A-buffer是为每个pixel存储一个可变数量的fragments。这个方法的一个问题是,对半透明物体所存储的fragments数量没有上限。[614]提供了一个Z3算法,一个每pixel固定fragment数量。当存储上限达到时,合并就会发生。[74,77]将这种概念一般化,使用k-buffer。它们早期的论文对此有一个很好的综述。
虽然所有这些反走样技术可以对多边形覆盖格子做出一个更好的估算,但是它们还是有些局限性。就像前边所说的,物体可能比屏幕各自还小,也就是说没有一个取样频率可以完全的捕捉到它们,所以,一个普通的取样模式总会有一些走样。一个反走样方法是随机的分布sample,每个点使用不同的取样模式。这叫做随机取样(stochastic sampling),它良好工作的原因是,随机性能够使用一个噪声来替换掉重复性导致的走样,这对于人类的观察系统而言,是更容易容忍的。
最常用的随机取样方法叫做抖动(jittering),是一种分层取样(stratified sampling)。假定一个pixel使用n个sample。将pixel范围划分成n个相等的区域,把每个sample放在其中一个区域的随机位置。最后的pixel的color对这些sample做一些平均而得到。N-rooks采样(N-rooks sampling)是另一种分层取样(stratified sampling),n个sample被放置在nxn的格子中,每行每列各一个,偶然的,一个N-rooks的pattern被Infinity Reality使用。她能够很好地捕捉接近平行和垂直的边界。这种架构下,每个像素采用相同的pattern,子像素都居中,所以它不是随机(stochastic)取样。
交错取样(interleaved sampling)。这个硬件允许每个像素16个取样,高达16个用户自定义的取样模式,可以用一个重复的模式混合在一起(亦即在一个4x4的像素中,每一个使用不同的pattern)。每个像素的取样模式是相同的,使用一个抖动方案(jittering scheme)。不过,有人发现[894,642]使用交错随机取样(interleaved stochastic sampling)可以把每pixel使用相同pattern引起的走样最小化。这个技术可以看做是累积缓存技术的一般化,因为取样模式(sampling pattern)是重复的,但是扩展几个像素而非一个单像素。
还有一些其他的取样和滤波技术。其中一个最好的取样模式叫做泊松圆盘取样(Poisson disk sampling),非均匀分布的点互相以最小距离分开。Molnar提出了一种可以用在实时渲染中的,使用一种满足Poisson disk pattern的无权重的取样,和高斯滤波(Gaussian filtering)核心。
一种让sample影响超过1个pixel的实时反走样技术是NVIDIA的旧的五点排布法(Quincunx),也叫作高分辨率反走样(high resolution antialiasing)(HRAA)。每个点的取样值都分配到她的四个邻居,所以它并不是平均权重的分布,而是中心sample占1/2,其他占1/8。因为这种共享,Quincunx架构需要一个pixel中的两个sample的平均值。这个模式近似于一种2d的三角滤波,正如上节所说,比方形滤波要好一些。虽然Quincunx方法已经销声匿迹,一些新的GPU又开始重新使用一个单sample的结果在pixels中,以得到更高质量的信号重建。比如,ATI Radeon HD 2000 使用一种custom filter antialiasing(CFAA),使用窄的和宽的三角滤波器来轻微延展到其他pixel格子。应该注意的是,sample应该从一个更大的范围收集,比如4x4或甚至5x5像素格子。这会儿貌似已经有新的图形卡可以做这种级别的滤波了。
这种共享sample的技术也用在移动平台的图形环境下。一个想法是,把Quinqunx和RGSS结合起来。这种模式叫做FLIPQUAD,每个像素只需要两个sample,和RGSS有类似的质量(4sample)。
Molnar提出了一种可以自适应地精细化的sampling pattern。这是一种随着时间提升取样个数的技术。这种架构在可交互应用中很有用。比如,当屏幕变化的时候,sampling rate比较低,当用户停止交互,屏幕稳定,图像就随着时间而更改善,因为有了更多的取样点,中间结果被展示出来。这种架构可以用累积缓存实现,当若干数目的sample被取到后进行显示。
取样率可以根据屏幕信息而变化。比如,在MSAA中,主要的关注点在于:低rate的计算shading的samples,在检测到边缘的时候,提升sample的数量。pixel shader可以被用来提升一个以per-surface为基础的质量,通过增加附加的贴图采样。通过这种方法,supersampling可以可选的被应用到那些可以获得好处的surface上。
眼睛对于不同强度比不同颜色更敏感。这一现象被应用在了Apple II上,提升它的空间感知分辨率。最新的使用是Microsoft的ClearType技术,基于液晶显示器(liquid-crystal display/LCD)的一些特性。LCD上展示的每个像素都由三个垂直的垂直的颜色矩形组成,忽略这些子像素矩形的颜色,这种结构使得在水平方向上有三倍的分辨率。给每个子像素使用不同的shade,在眼睛就把这些颜色汇聚起来时,红色和蓝色的边界将无法感知到。
总之,对于边缘的反走样,有许多的架构,比如对速度、质量、成本的折衷。没有一个解决方案是完美的,也不可能。但是MSAA和CSAA在速度和质量之间,提供了一个合理的折衷。随着时间的推移,制造业无疑会提供更好的sampling和滤波架构(filtering scheme)。比如,在2007年夏天,ATI引进了一个高质量(计算昂贵)的反走样架构,基于片元边缘检测(fragment edge detection),称为边缘检测反走样(edge detect antialiasing)。

0 0
原创粉丝点击