Filtering Approaches for Real-Time Anti-Aliasing(2011 SIGGRAPH)

Filtering Approaches for Real-Time Anti-Aliasing(2011 SIGGRAPH)

在2011的SIGGRAPH上,NVIDA提出了FXAA3.1,本文主要介绍FXAA实现思路,提供部分简单实现的代码。

1.What is FXAA 3.11

  • Fast approXimate Anti-Aliasing
  • Two algorithms

    - FXAA 3.11 Console (360 and PS3)

    - FXAA 3.11 Quality (PC)

  • Fixed set of constraints
    • One shader pass, only color input, only color output
    • Run on all APIs (GL, DX9, through DX11, etc)
    • Certainly better can be done under other constraints!

FXAA全称“Fast Approximate Anti-Aliasing”,翻译成中文就是“快速近似抗锯齿”。

FXAA3.11在之前FXAA1,2的基础上做了一些改进。

  • FXAA1:最早最基础的版本,也是在PC游戏中使用最广泛的,已用于《孤岛危机2》、《无主之地》。
  • FXAA2:针对Xbox 360游戏机专门设计。
  • FXAA3:Quality质量版本面向PC,Console主机版本则面向Xbox 360、PS3。

FXAA是一种单程像素着色器,和MLAA一样运行于目标游戏渲染管线的后期处理阶段,但不像后者那样使用DirectCompute,而只是单纯的后期处理着色器,不依赖于任何GPU计算API。正因为如此,FXAA技术对显卡没有特殊要求,完全兼容NVIDIA、AMD的不同显卡(MLAA仅支持A卡)和DX9、DX10、DX11。

2.How FXAA Working

  • Early exit for pixels

取4个方向以及中间像素,对5个位置的值做滤波操作,对于范围之外进行分段线性变换。对于差异较大的像素,进行AA。

maxLuma = max(nw,ne,sw,se)
contrast = max(nw,ne,sw,se,m) - min(nw,ne,sw,se,m)
if(contrast  >= max(minThreshold, maxLuma * threshold))

  • extra taps
dir.x = -((NW+NE)-(SW+SE))
dir.y = ((NW+SW)-(NE+SE))
dir.xy = normalize(dir.xy) * scale

使用2x2的区域,计算像素边界,做向量运算。得到dir之后归一化长度。

  • Optional extra 2 taps

    缩放dir.xy,扩展到8个像素

    minDir = min(|dir.x|, |dir.y|) * sharpness

  • Compare 4-tap filter luma to neighborhood luma

    比较4个方向的luma和相邻luma的值,

// Use the min and max luma range of the original 4 samples
 *  {NW, NE, SW, SE}
// If 4-tap filter luma exceeds this range,
 *   Assume invalid and use just the first 2 taps

  • 效果展示

3.简单实现

我自己再Direct11的环境下,参考FXAA思路,实现了简单版本的FXAA,相比自带d3d实现的4xMSAA,效果较为不明显,仅供交流学习。

//--------------------------------------------------------------------------------------
// File: FXAA.fx
//--------------------------------------------------------------------------------------

SamplerState samLinear : register(s0);
Texture2D txFxaa : register(t0);

struct PS_INPUT
{
    float4 Pos          : SV_POSITION;
    float4 PosProj      : POSITION;
    float3 Norm         : NORMAL;

    float4 Diffuse      : COLOR0;
    float2 Tex          : TEXCOORD;
    float3 Tangent      : TANGENT;
};

float4 FxaaPS(PS_INPUT input) : SV_Target
{
    float4 texColor = txFxaa.Sample(samLinear, input.Tex);

    // FXAA 3x3取9个像素
    float3 luma = float3(0.299, 0.587, 0.114);
    //luma = float3(0.33, 0.33, 0.33);
    float lumaTL = dot(luma, txFxaa.Sample(samLinear, input.Tex.xy + float2(-1.0, -1.0)).xyz);
    float lumaTR = dot(luma, txFxaa.Sample(samLinear, input.Tex.xy + float2(1.0, -1.0)).xyz);
    float lumaBL = dot(luma, txFxaa.Sample(samLinear, input.Tex.xy + float2(-1.0, 1.0)).xyz);
    float lumaBR = dot(luma, txFxaa.Sample(samLinear, input.Tex.xy + float2(1.0, 1.0)).xyz);
    float lumaM = dot(luma, txFxaa.Sample(samLinear, input.Tex.xy).xyz);

    float2 dir;
    dir.x = -((lumaTL + lumaTR) - (lumaBL + lumaBR));
    dir.y = (lumaTL + lumaBL) - (lumaTR + lumaBR);

    float FXAA_SPAN_MAX = 8.0;

    float direReduce = 1.0 / 128.0;
    float inverseDir = 1.0 / (min(abs(dir.x), abs(dir.y)) + direReduce);

    dir = min(float2(FXAA_SPAN_MAX, FXAA_SPAN_MAX),
        max(float2(-FXAA_SPAN_MAX, -FXAA_SPAN_MAX), dir*inverseDir));

    float3 res1 = (1.0 / 2.0) * (
        txFxaa.Sample(samLinear, input.Tex.xy + (dir * float2(1.0 / 3.0 - 0.5, 1.0 / 3.0 - 0.5))).xyz +
        txFxaa.Sample(samLinear, input.Tex.xy + (dir * float2(2.0 / 3.0 - 0.5, 2.0 / 3.0 - 0.5))).xyz);

    float3 res2 = res1 * (1.0 / 2.0) + (1.0 / 4.0) * (
        txFxaa.Sample(samLinear, input.Tex.xy + (dir * float2(0.0 / 3.0 - 0.5, 0.0 / 3.0 - 0.5))).xyz +
        txFxaa.Sample(samLinear, input.Tex.xy + (dir * float2(3.0 / 3.0 - 0.5, 3.0 / 3.0 - 0.5))).xyz);

    float lumaRes = dot(luma, res2);

    float lumaMin = min(lumaM, min(min(lumaTL, lumaTR), min(lumaBL, lumaBR)));
    float lumaMax = max(lumaM, max(max(lumaTL, lumaTR), max(lumaBL, lumaBR)));

    if (lumaRes <lumaMin || lumaRes > lumaMax)
        texColor = float4(res2, 1.0);
    else
        texColor = float4(res1, 1.0);

    return texColor;
}
  • 效果对比(左为无FXAA)

原文地址:https://www.cnblogs.com/SeekHit/p/9010571.html

时间: 2024-11-02 02:05:48

Filtering Approaches for Real-Time Anti-Aliasing(2011 SIGGRAPH)的相关文章

义务教育语文课程标准(2011 年版)

义务教育语文课程标准(2011 年版),是 2012 年出版的一本书,由中华人民共和国教育部制定. 在这里,你可以看到这本书封面的样子.这本书只有 80 面.40 页,很薄:定价 9 块钱. 顾名思义,这本书是为义务教育阶段.语文这门课程制定的标准.这个标准是给义务教育阶段一个方向:怎样教学生?怎样编教材?可以用哪些资源?要达到的标准是什么样子的? 义务教育阶段是指从小学一年级到初中三年级,也就是从一年级到九年级. 义务教育,是根据<宪法>规定,适龄儿童和青少年都必须接受,国家.社会和家庭都必

目标跟踪学习系列八:Struck:Structured Output Tracking with Kernels(2011 ICCV)

看来人机交互不是我想象的那么简单的,还是要花很多的功夫来打基础的.于是再来学习Tracking相关的一些文章算法. 在认真的学习了压缩跟踪(CT)以后,确实觉得自己对Tracking有了比较好的了解.但是看了在测试集上面的效果,被欺骗了原来CT的效果在真实的摄像头上面是很差劲的.唯一的优点就是快. 因此,还得回来学习一些其他的精度比较高的方法!这里选择了Struck.是大牛学长推荐的.同时本文使用了非线性的SVM算法,也想顺便的学习一下. 文章代码的位置:http://www.samhare.n

BPDU Filtering的意义(BPDU Filtering在全局配置与接口配置上的区别)

理解并演示:BPDU Filtering的意义(BPDU Filtering在全局配置与接口配置上的区别) 目标:理解BPDU Filtering的意义(BPDU Filtering在全局配置与接口配置上的区别) 取证:测试BPDU Filtering在全局模式下的配置效果 测试BPDUFiltering在接口模式下的配置效果 一个有趣的现象:全局启动BPUD过滤,有某个时候会有少量的BPDU报文被发送.   理解BPDU Filtering的意义(BPDU Filtering在全局配置与接口配

理解BPDU Filtering的意义(BPDU Filtering在全局配置与接口配置上的区别)

理解BPDU Filtering的意义(BPDU Filtering在全局配置与接口配置上的区别) 理解BPDU Filtering的意义(BPDU Filtering在全局配置与接口配置上的区别)                              本文截自于博主CCNP交换技术稿件内容 BPDU Filtering也叫BPDU过滤,它的意义是在某个端口上过滤BPDU的发送和接收,在这里需先要来理解一个前提:任何一个加入到生成树的交换机端口,都会发送并接收到相应的BPDU报文,其中包括被

《数字图像处理原理与实践(MATLAB版)》一书之代码Part8

本文系<数字图像处理原理与实践(MATLAB版)>一书之代码系列的Part8,辑录该书第375至第415页之代码,供有需要读者下载研究使用.至此全书代码发布已经接近尾声,希望这些源码能够对有需要的读者有所帮助.代码执行结果请参见原书配图,建议下载代码前阅读下文: 关于<数字图像处理原理与实践(MATLAB版)>一书代码发布的说明 http://blog.csdn.net/baimafujinji/article/details/40987807 P385-1 function y

Phalcon资源文件管理(Assets Management)

资源文件管理(Assets Management)? Phalcon\Assets是一个让开发者管理静态资源的组件,如管理css,javascript等. Phalcon\Assets\Manager 存在于DI容器中,所以我们可以在服务容器存在的 任何地方使用它来添加/管理资源. 添加资源(Adding Resources)? Assets支持两个内置的资源管理器:css和javascripts.我们可以根据需要创建其它的资源.资源管理器内部保存了两类资源集合一为 javascript另一为c

Deep Learning(深度学习)学习笔记整理

申明:本文非笔者原创,原文转载自:http://www.sigvc.org/bbs/thread-2187-1-3.html 4.2.初级(浅层)特征表示 既然像素级的特征表示方法没有作用,那怎样的表示才有用呢? 1995 年前后,Bruno Olshausen和 David Field 两位学者任职 Cornell University,他们试图同时用生理学和计算机的手段,双管齐下,研究视觉问题. 他们收集了很多黑白风景照片,从这些照片中,提取出400个小碎片,每个照片碎片的尺寸均为 16x1

Deep Learning(深度学习)学习笔记整理系列之(八)

Deep Learning(深度学习)学习笔记整理系列 [email protected] http://blog.csdn.net/zouxy09 作者:Zouxy version 1.0 2013-04-08 声明: 1)该Deep Learning的学习系列是整理自网上很大牛和机器学习专家所无私奉献的资料的.具体引用的资料请看参考文献.具体的版本声明也参考原文献. 2)本文仅供学术交流,非商用.所以每一部分具体的参考资料并没有详细对应.如果某部分不小心侵犯了大家的利益,还望海涵,并联系博主

最简单的视音频播放演示样例4:Direct3D播放RGB(通过Texture)

===================================================== 最简单的视音频播放演示样例系列文章列表: 最简单的视音频播放演示样例1:总述 最简单的视音频播放演示样例2:GDI播放YUV, RGB 最简单的视音频播放演示样例3:Direct3D播放YUV,RGB(通过Surface) 最简单的视音频播放演示样例4:Direct3D播放RGB(通过Texture) 最简单的视音频播放演示样例5:OpenGL播放RGB/YUV 最简单的视音频播放演示样例