屏幕映射

模型、视图和投影变换完成后,几何体位于规范观察体积 [−1,1]3[-1,1]^3 中。接下来要把连续的几何图元送到离散的显示设备,这一步称为光栅化 Rasterization。

视口变换先把 NDC 的 x、y 坐标映射到屏幕连续区域:

xs=W2(xndc+1),ys=H2(yndc+1).x_s=\frac W2(x_{ndc}+1), \qquad y_s=\frac H2(y_{ndc}+1).

屏幕坐标采用左下角为原点、向右为 x、向上为 y 的约定。像素用整数索引 (x,y)(x,y) 标识,但它代表的是单位方块 [x,x+1]×[y,y+1][x,x+1]\times[y,y+1],像素中心位于

(x+0.5,y+0.5).(x+0.5,y+0.5).

宽度为 WW、高度为 HH 的屏幕索引范围是 0≤x<W0\le x<W、0≤y<H0\le y<H,连续覆盖范围是 [0,W]×[0,H][0,W]\times[0,H]。z 坐标在视口阶段暂时保留,后续深度测试需要它。

屏幕与显示

图形学先把屏幕抽象成二维像素 Pixel数组。1920×1080 和 1280×720 是常见分辨率,后者通常简称 720p,前者简称 1080p。pixel 是 picture element 的缩写;在基础模型中,一个像素是内部颜色均匀的小方块,可以用 256 级灰度表示,也可以用 RGB 三个通道描述颜色。

“光栅 Raster”更准确地理解为规则的栅格或扫描图案,rasterize 是把内容按栅格离散地绘制到屏幕。物理显示设备并不都由理想方块构成,但屏幕数组模型便于建立光栅化算法。

示波器的荧光屏与偏转控制

图中的荧光屏可以把偏转信号变成可见轨迹。扫描式图像和直接描绘曲线的显示方式可以使用相似硬件,但输入组织方式不同;图形学中的像素数组是独立于这类物理实现的抽象。

连续轨迹绘图机和激光切割机也体现了“按控制信号逐点或逐线写入”的思想:前者驱动笔尖沿路径移动,后者驱动激光沿加工路径扫描金属或其他材料。它们与屏幕光栅化共享离散控制和扫描的观念,但输出介质不同,不能把物理轨迹设备直接等同于像素数组。

示波器可以用电子束在荧光屏上描出曲线;水平和竖直偏转信号分别采用正弦、余弦时,电子束会描出圆或其他参数曲线。阴极射线管 CRT 通过电子束的偏转和逐行扫描形成画面。早期电视还会使用隔行扫描:一帧由时间上相继显示的奇数行场和偶数行场组成,两个场交错后构成完整画面。它可以减少每个场的扫描量,但高速运动时场之间的位置不一致,边缘容易呈梳齿状或出现重影。

LCD 通过背光、偏振片和液晶分子的扭转改变透光率;“LED 显示器”有时指使用 LED 作为背光的 LCD,也可以指由发光二极管直接组成的主动发光面板,两者应区分;电子墨水通过电场移动带电颗粒,静态画面耗电较低,但颗粒翻转需要可见时间,刷新率较低。这些设备最终都要把颜色或亮度值组织成可观察的图像。

在现代系统中,显示图像通常先写入显存中的颜色缓冲区,显示控制器按刷新时序读取这块区域;深度缓冲和模板缓冲则为可见性测试提供辅助数据。显示设备如何发光,不会改变光栅化阶段对“像素数组”的数学抽象。

条状与交错排列的物理子像素

左侧 iPhone 6S 的红、绿、蓝子像素近似按竖条排列,右侧 Galaxy S5 使用交错布局,绿色样本更密。一个逻辑像素并不必然对应三个同形同面积的小方块,算法中的均匀方块模型与实际发光结构需要区分。

物理子像素的排列会影响显示端的采样密度。人眼对绿光更敏感,一些显示面板或相机感光器会提高绿色通道的采样密度;相机中的 Bayer 彩色滤色阵列属于感光器采样结构,不能拿来命名显示器的交错子像素布局。彩色打印机的半色调网点则属于减色系统,墨水或网点叠加越多,结果通常越暗;屏幕的 RGB 通道数值越高,结果通常越亮。

三角形图元

复杂曲面通常先离散成网格,再由图元装配成三角形 Triangle。三角形有几个重要性质:三个不共线的顶点确定唯一平面;它是最简单的非退化多边形;简单多边形可以剖分为三角形;三角形是凸集,内部和外部容易判定;三个顶点的颜色、法线、纹理坐标等属性可以在内部连续插值。

四边形可能不共面,非凸多边形或带洞多边形的内部规则也更复杂。三角形固定三个顶点,覆盖测试和插值规则稳定,适合 GPU 以相同程序并行处理大量图元。

三角形还具有明确的凸性:一点在三条有向边的同一侧,当且仅当它位于三角形内部或边界上。三个顶点上的属性可以用重心权重连续过渡,这些属性包括颜色、法线、深度和纹理坐标。三角形顶点数量固定,也让图元装配、裁剪和并行执行具有稳定的数据结构。

点采样光栅化

设屏幕空间中的三角形为 TT。定义连续的二值指示函数;在离散位置读取这个函数的值,就是采样 Sampling。

inside⁡(T,x,y)={1,(x,y) 在三角形内,0,其他情况.\operatorname{inside}(T,x,y)= \begin{cases} 1,&(x,y)\text{ 在三角形内},\\ 0,&\text{其他情况}. \end{cases}

光栅化的最简单实现是遍历屏幕中的像素,在每个像素中心采样一次:

1
2
3
4
5
for (int y = 0; y < height; ++y) {
for (int x = 0; x < width; ++x) {
image[x][y] = inside(triangle, x + 0.5, y + 0.5);
}
}

这里的采样是从连续函数的指定位置读取函数值。图形学还会采样时间、方向、体积、表面反射性质和纹理坐标;医学 CT 与核磁共振得到的三维组织数据,也需要通过采样与可视化处理。

把三角形光栅化理解为二维采样

图中格线划分像素方块,红色三角形仍是连续屏幕空间中的图元。在每个方块中心执行上述测试,就得到该像素的二值覆盖结果。中心没有落在三角形内时,即使三角形覆盖了这个像素的一部分面积,单点方法仍会把它判为背景;细窄三角形还可能穿过像素却完全错过中心。

内部测试

设三角形顶点按逆时针排列为 A,B,CA,B,C,测试点为 PP。沿循环顺序使用三条有向边:

s1=((B−A)×(P−A))z,s_1=((B-A)\times(P-A))_z,

s2=((C−B)×(P−B))z,s_2=((C-B)\times(P-B))_z,

s3=((A−C)×(P−C))z.s_3=((A-C)\times(P-C))_z.

三角形逆时针时,s1,s2,s3s_1,s_2,s_3 全部大于等于 0,点在三角形内部或边界上;顺时针时,三个值全部小于等于 0。叉积的绝对值是有向面积的两倍,符号表示测试点位于有向边的左侧还是右侧。

边界点需要统一规则。若共享边两侧的三角形都把边界判为内部,会重复着色;若都判为外部,则可能留下裂缝。硬件通常使用左上规则,把水平顶边或左侧边固定分给一个三角形。

包围盒与遍历

三角形只覆盖屏幕上的一小块区域,没必要遍历整个屏幕。计算它的轴对齐包围盒 AABB:

xmin=⌊min⁡(Ax,Bx,Cx)⌋,xmax=⌈max⁡(Ax,Bx,Cx)⌉,x_{min}=\lfloor\min(A_x,B_x,C_x)\rfloor, \qquad x_{max}=\lceil\max(A_x,B_x,C_x)\rceil,

ymin=⌊min⁡(Ay,By,Cy)⌋,ymax=⌈max⁡(Ay,By,Cy)⌉.y_{min}=\lfloor\min(A_y,B_y,C_y)\rfloor, \qquad y_{max}=\lceil\max(A_y,B_y,C_y)\rceil.

候选像素只需在这个矩形内测试。对细长、倾斜的三角形,包围盒中会有较多无效像素;逐扫描线求左右边界、使用边函数增量更新或采用分块光栅化,可以进一步缩小候选范围。边函数写成 E(x,y)=ax+by+cE(x,y)=ax+by+c 时,水平移动一个像素只需增加 aa,竖直移动一个像素只需增加 bb,硬件可以避免重复计算完整叉积。

三角形与屏幕轴对齐包围盒

蓝色矩形包含整个橙色三角形,矩形以外的样本不必测试。矩形内部仍有不少黑点位于三角形外,所以包围盒只缩小候选集合,最后还要执行精确的三条边测试。

背面剔除

对于绕序一致、封闭且不透明的物体,背向相机的表面通常不会出现在最终图像中,可以在光栅化前直接跳过。屏幕空间三角形 ABCABC 的有向面积为

Ascreen=12((B−A)×(C−A))z.A_{screen}=\frac12\big((B-A)\times(C-A)\big)_z.

在当前屏幕坐标约定下,Ascreen>0A_{screen}>0 表示投影顶点为逆时针绕序,通常作为正面;Ascreen<0A_{screen}<0 表示顺时针绕序,通常作为背面。Ascreen=0A_{screen}=0 时三角形投影退化为线段,也可以直接剔除。

背面剔除只判断朝向,不负责判断前向表面是否被另一个物体遮挡;后者由深度测试解决。薄片、双面材质、透明外壳和内部观察场景可能需要关闭剔除。镜像变换或屏幕 y 轴翻转会改变绕序,因此剔除规则必须和坐标系及顶点绕序约定一起设置。

走样

单中心采样把连续三角形变成 0 或 1 的像素值。倾斜边界在屏幕上呈阶梯状,这种伪影称为锯齿 Jaggies;从采样理论看,它属于混叠 Aliasing,也称走样。伪影 Artifact 是计算结果偏离预期的上位概念,混叠特指采样不足造成的信息混淆。

单点采样产生的阶梯状几何边缘

左图的放射状图案包含许多细窄三角形,右图放大它的局部:斜边被表示成一系列水平或竖直台阶,有些细缝还会被漏掉。变化来自二值覆盖判定,连续斜边并没有真的改变形状。

空间采样的另一个例子是摩尔纹 Moiré。细密周期纹理经过较稀疏的采样后,可能被误解成低频的大块条纹。

降低采样率后,衬衫纹理出现粗条纹

左侧衬衫保留细密纹理,右侧降低采样率后再放大。右侧领带和衬衫上的粗条纹不属于原来的衣物,原有高频被混入了较低频。拍摄另一块显示屏时,相机采样网格与屏幕子像素排列也会产生相似现象。

时间采样会出现车轮效应 Wagon-Wheel Effect。电影或视频用离散帧记录旋转过程,相邻帧中轮辐的位置可以对应多个运动方向;将这些位置匹配成连续运动时,就可能得到反向旋转的判断。

带有重复径向图案的转盘

图中的转盘有许多重复扇区。相邻帧若转过接近一个扇区的角度,图案会与原位置几乎重合;再多转或少转一点,观察到的差异可能对应一个缓慢反向运动。静态图片只展示了重复结构,反转现象来自连续帧的时间采样。

三种现象都与“信号变化比样本分布能够区分快”有关。空间里的斜边和细格纹,时间里的快速转动,可以用同一套采样理论分析。反走样需要先对连续信号滤波再采样,采样之后再模糊只能降低伪影的可见程度。

频率与傅里叶

一个一维余弦信号可以写成

f(x)=Acos⁡(2πνx+ϕ),f(x)=A\cos(2\pi\nu x+\phi),

其中 ν\nu 是单位距离内的周期数,AA 是振幅,ϕ\phi 是相位,周期为 1/ν1/\nu。频率越高,信号在相同距离内变化越多。

傅里叶级数说明,周期函数可以表示为常数项以及不同频率的正弦、余弦函数的线性组合。对阶跃或方波,加入的频率项越多,近似越精确;要精确表示突变边缘,理论上需要无限多个高频分量。

傅里叶变换 Fourier Transform把空间域信号变为频率域频谱:

F(ω)=∫−∞∞f(x)e−iωx dx,F(\omega)=\int_{-\infty}^{\infty}f(x)e^{-i\omega x}\,\mathrm dx,

f(x)=12π∫−∞∞F(ω)eiωx dω.f(x)=\frac1{2\pi}\int_{-\infty}^{\infty}F(\omega)e^{i\omega x}\,\mathrm d\omega.

两者互为逆变换,携带相同信息,只是组织方式不同。图像没有时间含义时,仍可把空间位置当作自变量,把对应的频率域称为空间频率域。

原图的平滑区域集中在频谱中心,边缘与纹理把能量扩展到外围

自然图像的平滑区域通常贡献较多低频信息,尖锐边缘、细小几何缝隙和高反差纹理包含更多高频信息。频谱图中心通常表示低频,离中心越远表示变化越快;图像边界做周期延拓时若左右或上下不连续,会产生沿频率轴延伸的高频亮线,应与图像内容本身区分。

在二维频谱中,频率向量指向亮度变化最快的方向,而不是纹理条纹延伸的方向。竖直条纹沿水平方向变化,因此能量会沿水平频率轴展开;中心亮点代表直流或平均亮度。理解这一点可以把图像中的边缘方向与频谱中的亮线方向联系起来。

频谱与滤波

这里先讨论线性滤波 Linear Filtering,它可以在频率域表示为对不同频段的保留或衰减。

  • 低通滤波保留低频,去掉高频,图像变得平滑、边缘变模糊;
  • 高通滤波去掉低频,只保留快速变化,结果突出边缘;
  • 带通滤波保留一个中间频带,可以突出特定尺度的纹理。

高通去掉低频后的空间图像和频谱

右侧频谱中心被清空,左侧整体明暗随之消失,发丝、外轮廓和衣服边缘仍然存在。高通保留快速变化,大面积平缓区域没有足够的高频成分,因此在结果中变暗。

低通只保留中心低频后的图像和频谱

右侧只剩中心附近的频段,左侧仍能辨认头部和衣服的大形状,但发丝和锐利边缘被平滑。频谱保留范围越小,能够表示的变化越缓慢,空间图像越模糊。

带通保留一段中间频率

右侧保留一个圆环:中心低频和外围高频都被清空。左侧只剩某种尺度的轮廓和过渡带,整体亮度与最细纹理均被削弱。把三幅结果一起比较,可以把频域中保留的位置与空间图像中保留的结构对应起来。

滤波可以用频谱图的中心和外围直观理解,也可以在空间域中通过卷积完成。盒式滤波器的旁瓣会让部分高频泄漏,频率硬截断对应的空间核还可能产生振铃;因此低通并不意味着所有波纹都会消失。

对二维图像,低通结果保留大面积明暗结构,去掉细纹理和锐利边缘;高通结果通常接近边缘或细节图;带通结果突出某个空间尺度。空间核的大小决定平均邻域,频率响应则决定哪些变化速度能够通过,两种描述是同一个滤波过程的两面。

采样的频域

理想规则采样可以用冲激梳表示。采样间隔为 TT 时,空间域冲激梳为

sT(x)=∑k=−∞∞δ(x−kT),s_T(x)=\sum_{k=-\infty}^{\infty}\delta(x-kT),

其中 δ\delta 是 Dirac delta 分布,满足

∫f(x)δ(x−a) dx=f(a).\int f(x)\delta(x-a)\,\mathrm dx=f(a).

连续信号与冲激梳相乘:

fs(x)=f(x)sT(x)=∑k=−∞∞f(kT)δ(x−kT).f_s(x)=f(x)s_T(x) =\sum_{k=-\infty}^{\infty}f(kT)\delta(x-kT).

冲激梳的频域间隔为采样角频率 ωs=2π/T\omega_s=2\pi/T:

ST(ω)=2πT∑k=−∞∞δ(ω−kωs).S_T(\omega)=\frac{2\pi}{T} \sum_{k=-\infty}^{\infty}\delta(\omega-k\omega_s).

根据卷积定理,时域相乘变成频域卷积:

Fs(ω)=1T∑k=−∞∞F(ω−kωs).F_s(\omega)=\frac1T\sum_{k=-\infty}^{\infty} F(\omega-k\omega_s).

所以采样在频率域中的效果是把原始频谱按采样频率周期复制。采样越密,复制间隔越大;采样越稀,复制副本越靠近。这就是“空间稀疏对应频域拥挤”的来源。

规则采样在频率域产生周期复制

按行对照两列:上排是连续信号及其原始频谱,中排是空间中的采样梳及频率中的采样梳,下排是采样结果和周期平移的频谱副本。减小采样频率会使右下图的副本靠近,直至发生重叠;此时不同连续频率可以产生相同离散样本。

抗锯齿先限制频带,再执行采样

图的上半部分比较滤波前后的频谱,低通先去掉超过采样能力的外围频率;下半部分再用较低采样率复制变窄后的频谱,副本之间保持间隔,因此不会互相重叠。若跳过上一步直接采样,原始高频就会折回低频形成错误图案。

采样极限

设信号最高频率为 fmaxf_{max},采样频率为 fsf_s。为了让相邻频谱副本不重叠,需要满足奈奎斯特条件:

fs>2fmax.f_s>2f_{max}.

对给定信号,2fmax2f_{max} 称为奈奎斯特率 Nyquist Rate;对给定采样频率,fs/2f_s/2 称为奈奎斯特频率 Nyquist Frequency。临界情况下还要考虑频带端点和相位,因此工程上通常留出余量,不把采样频率恰好压在等号上。

当 fs<2fmaxf_s<2f_{max} 时,频谱副本重叠,高频内容混入低频区域。离散采样点无法区分两个频率不同但样本相同的信号,因为

ei2π(f+kfs)nT=ei2πfnTei2πkn=ei2πfnT.e^{i2\pi(f+kf_s)nT} =e^{i2\pi fnT}e^{i2\pi kn} =e^{i2\pi fnT}.

这也是混叠不可逆的原因:同一组离散样本可能来自多个不同的连续信号。

对带限信号,奈奎斯特条件和理想重建能够保证恢复;对三角形边界这样的非带限信号,条件只能作为分析和近似的依据。提高显示分辨率通常能减轻锯齿,因为频谱副本间距变大、重叠区域减少,但无限高频仍然存在。

几何边界是阶跃信号,理论上含有无限高频。提高分辨率可以减轻锯齿,却不能把非带限信号变成带限信号;真正的反走样要在采样前限制频带。

卷积

连续信号 ff 与滤波核 gg 的卷积定义为

(f∗g)(x)=∫−∞∞f(τ)g(x−τ) dτ.(f*g)(x)=\int_{-\infty}^{\infty}f(\tau)g(x-\tau)\,\mathrm d\tau.

工程上可以把它理解为一个窗口沿信号移动,在每个位置把窗口权重与覆盖的信号值逐项相乘再求和。权重为 1/4,1/2,1/41/4,1/2,1/4 的窗口作用于 1,3,51,3,5 时结果为 3,作用于 3,5,33,5,3 时结果为 4;每个位置都得到邻域的加权平均。

卷积 Convolution的定理给出

F{f∗g}(ω)=F(ω)G(ω).\mathcal F\{f*g\}(\omega)=F(\omega)G(\omega).

空间域做卷积等价于频域逐点相乘;空间域逐点相乘则等价于频域卷积。于是可以选择在图像邻域中做加权平均,也可以先变换到频域相乘,再做逆变换。

空间域卷积对应频域逐点相乘,滤波器频谱决定保留的频率

图中把“图像与空间域卷积核”的路径和“分别变换到频域、逐点相乘、再逆变换”的路径并列展示;两条路径都得到平滑的输出,说明卷积定理把邻域平均与频率选择连接起来。

最简单的二维盒式滤波器是 3×33\times3 的九个 1/91/9。每个输出像素是周围九个像素的平均,整体变得模糊;系数和为 1 可以保持常量图像的亮度。

一维宽度为 ww 的归一化盒核为

hw(x)={1/w,∣x∣≤w/2,0,其他情况.h_w(x)= \begin{cases} 1/w,&|x|\le w/2,\\ 0,&\text{其他情况}. \end{cases}

它的傅里叶变换可以逐步算出:

Hw(ω)=1w∫−w/2w/2e−iωx dx=eiωw/2−e−iωw/2iwω=sin⁡(ωw/2)ωw/2.\begin{aligned} H_w(\omega) &=\frac1w\int_{-w/2}^{w/2}e^{-i\omega x}\,\mathrm dx\\ &=\frac{e^{i\omega w/2}-e^{-i\omega w/2}}{iw\omega}\\ &=\frac{\sin(\omega w/2)}{\omega w/2}. \end{aligned}

因此它是 sinc 函数:

Hw(ω)=sin⁡(ωw/2)ωw/2=sinc⁡(ωw2).H_w(\omega) =\frac{\sin(\omega w/2)}{\omega w/2} =\operatorname{sinc}\left(\frac{\omega w}{2}\right).

空间核越宽,频域主瓣越窄,主要保留的频率越低,图像越模糊;sinc 旁瓣仍会让部分高频通过。

这里采用 sinc⁡(x)=sin⁡x/x\operatorname{sinc}(x)=\sin x/x 的定义,并在 x=0x=0 处按极限取 1,所以归一化盒核的零频响应为 1。盒核的正空间权重不会像理想频域硬截断那样产生明显过冲,但旁瓣会带来高频泄漏和轻微波纹。

二维方形盒核可以分离成 x、y 两个一维盒核,频域响应也分离为两个 sinc 的乘积。旁瓣的正负交替意味着某些频段会出现相位反转,这也是盒式滤波器不等价于理想无波纹低通的原因。

空间 box 核越宽,频域 sinc 主瓣越窄;旁瓣仍会通过部分频率

左侧白色方块是空间域中的方形盒核,右侧是它的频谱幅值:中心主瓣外仍有沿水平、竖直方向排列的衰减旁瓣,这个十字结构来自两个一维 sinc 的可分离乘积。结合前面的变换式,扩大白色方块会使右侧中心主瓣收窄,主要通过的频率降低;旁瓣仍然存在,盒核没有严格的截止频率。

预滤波

反走样的顺序是:先对连续信号做低通预滤波,衰减当前采样网格无法表达的高频,再进行离散采样。频域上,预滤波把原始频谱变窄;采样后虽然仍会复制,但副本不再重叠。

先采样再模糊会得到 blurred aliasing。采样已经把高频折叠到低频,之后的模糊无法判断哪些低频来自原信号、哪些来自折叠错误,只能把错误结果一起变软,不能恢复真实边界。

覆盖率

对纯色三角形,单位像素盒滤波后的值就是图元在像素中的覆盖率。若像素区域为 PP,定义

CP=1∣P∣∬Pinside⁡(T,x,y) dxdy.C_P=\frac1{|P|}\iint_P\operatorname{inside}(T,x,y)\,\mathrm dx\mathrm dy.

单位像素面积为 1 时,CPC_P 就是被覆盖面积的比例。纯色前景与背景的颜色可以按覆盖率混合:

Cpixel=CPCtriangle+(1−CP)Cbackground.C_{pixel}=C_P C_{triangle}+(1-C_P)C_{background}.

覆盖 1/8 的像素得到 12.5% 的前景颜色和 87.5% 的背景颜色;覆盖一半时取两者各半;完全覆盖时取纯前景颜色。这样,原本被二值采样丢掉的边缘面积信息重新进入像素值。

精确计算任意三角形与像素方块的交集面积需要求交、分类和多边形面积计算,逐像素执行代价很高,所以实时硬件通常采用多采样近似。

超采样

在一个像素内部放置 NN 个子采样点,通过平均 inside 值近似覆盖率:

CP≈1N∑i=1Ninside⁡(T,xi,yi).C_P\approx\frac1N\sum_{i=1}^{N} \operatorname{inside}(T,x_i,y_i).

2×2 子样本可以得到 0%、25%、50%、75% 和 100% 五种覆盖率;4×4 子样本得到 17 个离散等级。样本越多,面积估计通常越准确,但覆盖测试、深度和存储成本也随之增加。

要区分两种常见实现。SSAA 对每个子样本都执行完整着色,再把结果降采样,计算量和存储量都随样本数增加。MSAA 主要为子样本保存覆盖和深度,属于同一图元的样本通常可以共享一次着色,再按覆盖率解析到像素。MSAA 改善的是几何边缘,不会自动消除着色器或纹理内部的高频。

MSAA 不是提高屏幕分辨率。4×4 的 16 个子样本只是为了估计一个原像素的覆盖率,屏幕仍然有原来的像素数量。工业实现也不一定使用规则 4×4 网格,常用不规则样本分布,部分样本可以在邻近像素间复用,因此 4× MSAA 的实际开销通常低于完整四倍渲染。

如果把一个像素内部布置 100×100100\times100 个样本,覆盖率估计会更细,但每个像素需要 10,000 次覆盖判断,实时渲染通常无法接受。这个极端例子说明了覆盖精度和计算量之间的直接取舍。

每像素四个覆盖样本

实线划分原像素,虚线把每个像素分成四块,每块中心都有一个样本。红点在三角形内,灰点在外;某个像素有三个红点时,覆盖率近似为 3/4,只有一个红点时近似为 1/4。子样本的平均只估计覆盖面积,三角形本身仍是连续的。

4×4 超采样后的几何边缘与局部放大

结果图使用每像素 4×4 个样本。与前面单点采样的放大图比较,红色尖边和浅色背景之间出现中间颜色,细缝也较连续。它们来自多个样本的平均,边缘仍有有限分辨率下的离散误差,不能等同于精确的连续面积积分。

解析与透明

多采样结束后,需要把子样本合成为一个屏幕像素,这一步称为 resolve。若每个子样本的最终可见颜色为 CiC_i,简单不透明情况下

Cresolve=1N∑i=1NCi.C_{resolve}=\frac1N\sum_{i=1}^{N}C_i.

每个子样本应先完成覆盖判断、深度测试和必要的透明混合,再做 resolve;过早平均会丢失样本之间的遮挡关系。覆盖率描述几何图元占据像素的面积比例,透明度描述材质让光透过的比例,两者可以同时出现,不能把透明度直接当成覆盖率。

采用 Source-Over 混合时,直通透明度(Straight Alpha)为

ao=as+(1−as)ad,a_o=a_s+(1-a_s)a_d,

Co=asCs+(1−as)adCdao,ao>0.C_o=\frac{a_sC_s+(1-a_s)a_dC_d}{a_o}, \qquad a_o>0.

预乘透明度(Premultiplied Alpha)把颜色存成 C~=aC\widetilde C=aC,混合式简化为

C~o=C~s+(1−as)C~d,ao=as+(1−as)ad.\widetilde C_o=\widetilde C_s+(1-a_s)\widetilde C_d, \qquad a_o=a_s+(1-a_s)a_d.

颜色混合应在线性光空间进行,再根据显示编码转换到输出空间;预乘形式还能避免完全透明像素携带无效 RGB 背景色,但不能修复错误的前后顺序。

Source-Over 不满足交换律。两层不透明度都为 1/21/2 时,A 覆盖 B 与 B 覆盖 A 得到的预乘颜色分别为 0.5CA+0.25CB0.5C_A+0.25C_B 和 0.5CB+0.25CA0.5C_B+0.25C_A;透明图元仍然需要正确的前后顺序或专门的顺序无关透明算法。

工程抗锯齿

FXAA Fast Approximate Anti-Aliasing 在已得到的颜色图像上检测高对比度边缘,再沿边缘方向进行平滑。它不增加几何采样,也不能恢复已经混叠的真实覆盖率,优点是成本低,代价是可能让局部图像变软。

TAA Temporal Anti-Aliasing 把样本分布到时间上。每帧可以抖动像素内的采样位置,再利用运动向量把上一帧样本重投影到当前帧,累积静态场景的覆盖信息。物体移动、遮挡变化或历史样本失效时,需要拒绝无效历史,否则会产生拖影和重影。

这两种方法和 MSAA 的位置不同:MSAA 在单帧内增加空间覆盖样本,TAA 利用多帧历史,FXAA 在已经采样后的图像上做视觉平滑。它们都不能绕开采样造成的信息损失,只是在不同阶段降低可见伪影。

超分辨率

超分辨率和反走样都处理样本不足,但发生阶段不同。把 512×512 图像放大到 1024×1024 时,原始高频细节已经没有被采到,只能依据插值、局部统计或训练得到的先验估计缺失信息。反走样在采样前限制频带,超分辨率在采样后重建高分辨率信号。

DLSS 等深度学习超采样方法属于后者:模型从大量高、低分辨率图像中学习局部细节的补全方式。它可能得到视觉上合理的高频,但这些细节是估计结果,不是从低分辨率样本中无损恢复出来的原始信息。

从连续几何到离散像素、从采样伪影到频域解释,再到预滤波和工程抗锯齿,这条链条到这里已经闭合。深度缓冲会在下一篇开头接上可见性问题。