- 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
- 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
- //--------------------------------------------------------------------------------------
- // 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;
- }
来源: http://www.bubuko.com/infodetail-2592602.html