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

來源:互聯網
上載者:User

標籤:遊戲機   saml   normal   ade   計算   消除鋸齒   效果   快速   cpp   

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)

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.