图形开发笔记 - 抗锯齿篇(2)FXAA Quality
来源:网友推荐 更新:2025-05-16
快速近似抗锯齿(FXAA)是一种屏幕空间抗锯齿算法,由Nvidia的Timothy Lottes开发,属于形态抗锯齿解决方案。FXAA相较于MLAA更为简化,通过分析图像检测视觉特征边缘,选择性地模糊这些边缘以消除锯齿。
FXAA有FXAA 3.11 Console和FXAA 3.11 Quality两个版本,Quality版本更全面,简化版本Console将在下一章讨论。算法主要通过计算像素亮度,存储在Alpha通道,从而衡量对比度。
亮度信息计算后,对比度通过比较当前像素及其周围四个像素的亮度最大值与最小值之差来确定。对比度较小的像素将被阈值过滤。
接着,进行对比度像素融合,融合比例根据像素周围亮度差异大小决定,差异越大,融合比例越高。
融合系数通过比较水平或竖直方向亮度差异来计算,确定融合方向。为了避免纹理映射带来的干扰,使用SAMPLE_TEXTURE2D_LOD并借助纹理过滤自动进行融合。
实际锯齿边界可能倾斜,因此需要额外采样以准确找到边缘位置。双线性过滤可帮助在边界处采样得到两侧像素的平均亮度值。
通过将亮度与原始边缘位置亮度比较,找到终点,继续搜索直至找到边缘端点。在画面中几乎所有像素变为白色后,可以可视化终点距离。
最后,使用到边缘最近端点的距离确定混合系数,靠近端点的像素系数更大。端点像素亮度需与当前像素亮度在同一侧。
FXAA的优点包括简便高效,适用于大规模渲染;缺点则在于可能导致画面轻微模糊,特别是在高对比度区域。
FXAA的开源实现可在Unity中找到,相关资源包括catlikecoding.com/unity和张亚坤的《主流抗锯齿方案详解(三)FXAA》。
FXAA有FXAA 3.11 Console和FXAA 3.11 Quality两个版本,Quality版本更全面,简化版本Console将在下一章讨论。算法主要通过计算像素亮度,存储在Alpha通道,从而衡量对比度。
亮度信息计算后,对比度通过比较当前像素及其周围四个像素的亮度最大值与最小值之差来确定。对比度较小的像素将被阈值过滤。
接着,进行对比度像素融合,融合比例根据像素周围亮度差异大小决定,差异越大,融合比例越高。
融合系数通过比较水平或竖直方向亮度差异来计算,确定融合方向。为了避免纹理映射带来的干扰,使用SAMPLE_TEXTURE2D_LOD并借助纹理过滤自动进行融合。
实际锯齿边界可能倾斜,因此需要额外采样以准确找到边缘位置。双线性过滤可帮助在边界处采样得到两侧像素的平均亮度值。
通过将亮度与原始边缘位置亮度比较,找到终点,继续搜索直至找到边缘端点。在画面中几乎所有像素变为白色后,可以可视化终点距离。
最后,使用到边缘最近端点的距离确定混合系数,靠近端点的像素系数更大。端点像素亮度需与当前像素亮度在同一侧。
FXAA的优点包括简便高效,适用于大规模渲染;缺点则在于可能导致画面轻微模糊,特别是在高对比度区域。
FXAA的开源实现可在Unity中找到,相关资源包括catlikecoding.com/unity和张亚坤的《主流抗锯齿方案详解(三)FXAA》。