This commit is contained in:
Michael 2018-08-01 00:50:51 -07:00
parent 03985f7830
commit 7ffbbde804
5 changed files with 772 additions and 772 deletions

View File

@ -1,350 +1,350 @@
#version 420 #version 420
#extension GL_ARB_texture_gather : enable #extension GL_ARB_texture_gather : enable
/*-----------------------------settings-------------------------------------*/ /*-----------------------------settings-------------------------------------*/
#define Subpix 1.00 //[0.000 to 1.000] Choose the amount of sub-pixel aliasing removal. #define Subpix 1.00 //[0.000 to 1.000] Choose the amount of sub-pixel aliasing removal.
#define EdgeThreshold 0.125 //[0.000 to 1.000] Edge detection threshold. The minimum amount of local contrast required to apply algorithm. #define EdgeThreshold 0.125 //[0.000 to 1.000] Edge detection threshold. The minimum amount of local contrast required to apply algorithm.
#define EdgeThresholdMin 0.0625 //[0.000 to 1.000] Darkness threshold. Trims the algorithm from processing darks. #define EdgeThresholdMin 0.0625 //[0.000 to 1.000] Darkness threshold. Trims the algorithm from processing darks.
/*--------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------*/
// shader 0f2b9ee517917425 // shader 0f2b9ee517917425
// fxaa in inventory screen // fxaa in inventory screen
// original shader dumped using cemu 1.10.0f, BotW 1.3.1 // original shader dumped using cemu 1.10.0f, BotW 1.3.1
layout(binding = 0) uniform sampler2D textureUnitPS0; layout(binding = 0) uniform sampler2D textureUnitPS0;
layout(binding = 1) uniform sampler2D textureUnitPS1; layout(binding = 1) uniform sampler2D textureUnitPS1;
layout(location = 0) in vec4 passParameterSem2; layout(location = 0) in vec4 passParameterSem2;
layout(location = 0) out vec4 passPixelColor0; layout(location = 0) out vec4 passPixelColor0;
uniform vec2 uf_fragCoordScale; uniform vec2 uf_fragCoordScale;
#define FXAA_QUALITY__PS 12 #define FXAA_QUALITY__PS 12
#define FXAA_QUALITY__P0 1.0 #define FXAA_QUALITY__P0 1.0
#define FXAA_QUALITY__P1 1.0 #define FXAA_QUALITY__P1 1.0
#define FXAA_QUALITY__P2 1.0 #define FXAA_QUALITY__P2 1.0
#define FXAA_QUALITY__P3 1.0 #define FXAA_QUALITY__P3 1.0
#define FXAA_QUALITY__P4 1.0 #define FXAA_QUALITY__P4 1.0
#define FXAA_QUALITY__P5 1.5 #define FXAA_QUALITY__P5 1.5
#define FXAA_QUALITY__P6 2.0 #define FXAA_QUALITY__P6 2.0
#define FXAA_QUALITY__P7 2.0 #define FXAA_QUALITY__P7 2.0
#define FXAA_QUALITY__P8 2.0 #define FXAA_QUALITY__P8 2.0
#define FXAA_QUALITY__P9 2.0 #define FXAA_QUALITY__P9 2.0
#define FXAA_QUALITY__P10 4.0 #define FXAA_QUALITY__P10 4.0
#define FXAA_QUALITY__P11 8.0 #define FXAA_QUALITY__P11 8.0
#define FxaaBool bool #define FxaaBool bool
#define FxaaDiscard discard #define FxaaDiscard discard
#define FxaaFloat float #define FxaaFloat float
#define FxaaFloat2 vec2 #define FxaaFloat2 vec2
#define FxaaFloat3 vec3 #define FxaaFloat3 vec3
#define FxaaFloat4 vec4 #define FxaaFloat4 vec4
#define FxaaHalf float #define FxaaHalf float
#define FxaaHalf2 vec2 #define FxaaHalf2 vec2
#define FxaaHalf3 vec3 #define FxaaHalf3 vec3
#define FxaaHalf4 vec4 #define FxaaHalf4 vec4
#define FxaaInt2 ivec2 #define FxaaInt2 ivec2
#define FxaaSat(x) clamp(x, 0.0, 1.0) #define FxaaSat(x) clamp(x, 0.0, 1.0)
#define FxaaTex sampler2D #define FxaaTex sampler2D
#define FxaaTexTop(t, p) textureLod(t, p, 0.0) #define FxaaTexTop(t, p) textureLod(t, p, 0.0)
#define FxaaTexOff(t, p, o, r) textureLodOffset(t, p, 0.0, o) #define FxaaTexOff(t, p, o, r) textureLodOffset(t, p, 0.0, o)
#define FxaaTexAlpha4(t, p) textureGather(t, p, 3) #define FxaaTexAlpha4(t, p) textureGather(t, p, 3)
#define FxaaTexOffAlpha4(t, p, o) textureGatherOffset(t, p, o, 3) #define FxaaTexOffAlpha4(t, p, o) textureGatherOffset(t, p, o, 3)
#define FxaaTexGreen4(t, p) textureGather(t, p, 1) #define FxaaTexGreen4(t, p) textureGather(t, p, 1)
#define FxaaTexOffGreen4(t, p, o) textureGatherOffset(t, p, o, 1) #define FxaaTexOffGreen4(t, p, o) textureGatherOffset(t, p, o, 1)
FxaaFloat4 FxaaPixelShader( FxaaFloat4 FxaaPixelShader(
FxaaFloat2 pos, FxaaFloat2 pos,
FxaaTex tex, FxaaTex tex,
FxaaTex lum, FxaaTex lum,
FxaaFloat2 fxaaQualityRcpFrame, FxaaFloat2 fxaaQualityRcpFrame,
FxaaFloat fxaaQualitySubpix, FxaaFloat fxaaQualitySubpix,
FxaaFloat fxaaQualityEdgeThreshold, FxaaFloat fxaaQualityEdgeThreshold,
FxaaFloat fxaaQualityEdgeThresholdMin FxaaFloat fxaaQualityEdgeThresholdMin
) { ) {
FxaaFloat2 posM; FxaaFloat2 posM;
posM.x = pos.x; posM.x = pos.x;
posM.y = pos.y; posM.y = pos.y;
FxaaFloat4 rgbyM = vec4(FxaaTexTop(tex, posM).xyz, FxaaTexTop(lum, posM).x); FxaaFloat4 rgbyM = vec4(FxaaTexTop(tex, posM).xyz, FxaaTexTop(lum, posM).x);
#define lumaM rgbyM.w #define lumaM rgbyM.w
FxaaFloat4 luma4A = textureGather(lum, posM); FxaaFloat4 luma4A = textureGather(lum, posM);
FxaaFloat4 luma4B = textureGatherOffset(lum, posM, FxaaInt2(-1, -1)); FxaaFloat4 luma4B = textureGatherOffset(lum, posM, FxaaInt2(-1, -1));
#define lumaE luma4A.z #define lumaE luma4A.z
#define lumaS luma4A.x #define lumaS luma4A.x
#define lumaSE luma4A.y #define lumaSE luma4A.y
#define lumaNW luma4B.w #define lumaNW luma4B.w
#define lumaN luma4B.z #define lumaN luma4B.z
#define lumaW luma4B.x #define lumaW luma4B.x
FxaaFloat maxSM = max(lumaS, lumaM); FxaaFloat maxSM = max(lumaS, lumaM);
FxaaFloat minSM = min(lumaS, lumaM); FxaaFloat minSM = min(lumaS, lumaM);
FxaaFloat maxESM = max(lumaE, maxSM); FxaaFloat maxESM = max(lumaE, maxSM);
FxaaFloat minESM = min(lumaE, minSM); FxaaFloat minESM = min(lumaE, minSM);
FxaaFloat maxWN = max(lumaN, lumaW); FxaaFloat maxWN = max(lumaN, lumaW);
FxaaFloat minWN = min(lumaN, lumaW); FxaaFloat minWN = min(lumaN, lumaW);
FxaaFloat rangeMax = max(maxWN, maxESM); FxaaFloat rangeMax = max(maxWN, maxESM);
FxaaFloat rangeMin = min(minWN, minESM); FxaaFloat rangeMin = min(minWN, minESM);
FxaaFloat rangeMaxScaled = rangeMax * fxaaQualityEdgeThreshold; FxaaFloat rangeMaxScaled = rangeMax * fxaaQualityEdgeThreshold;
FxaaFloat range = rangeMax - rangeMin; FxaaFloat range = rangeMax - rangeMin;
FxaaFloat rangeMaxClamped = max(fxaaQualityEdgeThresholdMin, rangeMaxScaled); FxaaFloat rangeMaxClamped = max(fxaaQualityEdgeThresholdMin, rangeMaxScaled);
FxaaBool earlyExit = range < rangeMaxClamped; FxaaBool earlyExit = range < rangeMaxClamped;
if(earlyExit) if(earlyExit)
return rgbyM; return rgbyM;
FxaaFloat lumaNE = FxaaTexOff(lum, posM, FxaaInt2(1, -1), fxaaQualityRcpFrame.xy).x; FxaaFloat lumaNE = FxaaTexOff(lum, posM, FxaaInt2(1, -1), fxaaQualityRcpFrame.xy).x;
FxaaFloat lumaSW = FxaaTexOff(lum, posM, FxaaInt2(-1, 1), fxaaQualityRcpFrame.xy).x; FxaaFloat lumaSW = FxaaTexOff(lum, posM, FxaaInt2(-1, 1), fxaaQualityRcpFrame.xy).x;
FxaaFloat lumaNS = lumaN + lumaS; FxaaFloat lumaNS = lumaN + lumaS;
FxaaFloat lumaWE = lumaW + lumaE; FxaaFloat lumaWE = lumaW + lumaE;
FxaaFloat subpixRcpRange = 1.0/range; FxaaFloat subpixRcpRange = 1.0/range;
FxaaFloat subpixNSWE = lumaNS + lumaWE; FxaaFloat subpixNSWE = lumaNS + lumaWE;
FxaaFloat edgeHorz1 = (-2.0 * lumaM) + lumaNS; FxaaFloat edgeHorz1 = (-2.0 * lumaM) + lumaNS;
FxaaFloat edgeVert1 = (-2.0 * lumaM) + lumaWE; FxaaFloat edgeVert1 = (-2.0 * lumaM) + lumaWE;
FxaaFloat lumaNESE = lumaNE + lumaSE; FxaaFloat lumaNESE = lumaNE + lumaSE;
FxaaFloat lumaNWNE = lumaNW + lumaNE; FxaaFloat lumaNWNE = lumaNW + lumaNE;
FxaaFloat edgeHorz2 = (-2.0 * lumaE) + lumaNESE; FxaaFloat edgeHorz2 = (-2.0 * lumaE) + lumaNESE;
FxaaFloat edgeVert2 = (-2.0 * lumaN) + lumaNWNE; FxaaFloat edgeVert2 = (-2.0 * lumaN) + lumaNWNE;
FxaaFloat lumaNWSW = lumaNW + lumaSW; FxaaFloat lumaNWSW = lumaNW + lumaSW;
FxaaFloat lumaSWSE = lumaSW + lumaSE; FxaaFloat lumaSWSE = lumaSW + lumaSE;
FxaaFloat edgeHorz4 = (abs(edgeHorz1) * 2.0) + abs(edgeHorz2); FxaaFloat edgeHorz4 = (abs(edgeHorz1) * 2.0) + abs(edgeHorz2);
FxaaFloat edgeVert4 = (abs(edgeVert1) * 2.0) + abs(edgeVert2); FxaaFloat edgeVert4 = (abs(edgeVert1) * 2.0) + abs(edgeVert2);
FxaaFloat edgeHorz3 = (-2.0 * lumaW) + lumaNWSW; FxaaFloat edgeHorz3 = (-2.0 * lumaW) + lumaNWSW;
FxaaFloat edgeVert3 = (-2.0 * lumaS) + lumaSWSE; FxaaFloat edgeVert3 = (-2.0 * lumaS) + lumaSWSE;
FxaaFloat edgeHorz = abs(edgeHorz3) + edgeHorz4; FxaaFloat edgeHorz = abs(edgeHorz3) + edgeHorz4;
FxaaFloat edgeVert = abs(edgeVert3) + edgeVert4; FxaaFloat edgeVert = abs(edgeVert3) + edgeVert4;
FxaaFloat subpixNWSWNESE = lumaNWSW + lumaNESE; FxaaFloat subpixNWSWNESE = lumaNWSW + lumaNESE;
FxaaFloat lengthSign = fxaaQualityRcpFrame.x; FxaaFloat lengthSign = fxaaQualityRcpFrame.x;
FxaaBool horzSpan = edgeHorz >= edgeVert; FxaaBool horzSpan = edgeHorz >= edgeVert;
FxaaFloat subpixA = subpixNSWE * 2.0 + subpixNWSWNESE; FxaaFloat subpixA = subpixNSWE * 2.0 + subpixNWSWNESE;
if(!horzSpan) lumaN = lumaW; if(!horzSpan) lumaN = lumaW;
if(!horzSpan) lumaS = lumaE; if(!horzSpan) lumaS = lumaE;
if(horzSpan) lengthSign = fxaaQualityRcpFrame.y; if(horzSpan) lengthSign = fxaaQualityRcpFrame.y;
FxaaFloat subpixB = (subpixA * (1.0/12.0)) - lumaM; FxaaFloat subpixB = (subpixA * (1.0/12.0)) - lumaM;
FxaaFloat gradientN = lumaN - lumaM; FxaaFloat gradientN = lumaN - lumaM;
FxaaFloat gradientS = lumaS - lumaM; FxaaFloat gradientS = lumaS - lumaM;
FxaaFloat lumaNN = lumaN + lumaM; FxaaFloat lumaNN = lumaN + lumaM;
FxaaFloat lumaSS = lumaS + lumaM; FxaaFloat lumaSS = lumaS + lumaM;
FxaaBool pairN = abs(gradientN) >= abs(gradientS); FxaaBool pairN = abs(gradientN) >= abs(gradientS);
FxaaFloat gradient = max(abs(gradientN), abs(gradientS)); FxaaFloat gradient = max(abs(gradientN), abs(gradientS));
if(pairN) lengthSign = -lengthSign; if(pairN) lengthSign = -lengthSign;
FxaaFloat subpixC = FxaaSat(abs(subpixB) * subpixRcpRange); FxaaFloat subpixC = FxaaSat(abs(subpixB) * subpixRcpRange);
FxaaFloat2 posB; FxaaFloat2 posB;
posB.x = posM.x; posB.x = posM.x;
posB.y = posM.y; posB.y = posM.y;
FxaaFloat2 offNP; FxaaFloat2 offNP;
offNP.x = (!horzSpan) ? 0.0 : fxaaQualityRcpFrame.x; offNP.x = (!horzSpan) ? 0.0 : fxaaQualityRcpFrame.x;
offNP.y = ( horzSpan) ? 0.0 : fxaaQualityRcpFrame.y; offNP.y = ( horzSpan) ? 0.0 : fxaaQualityRcpFrame.y;
if(!horzSpan) posB.x += lengthSign * 0.5; if(!horzSpan) posB.x += lengthSign * 0.5;
if( horzSpan) posB.y += lengthSign * 0.5; if( horzSpan) posB.y += lengthSign * 0.5;
FxaaFloat2 posN; FxaaFloat2 posN;
posN.x = posB.x - offNP.x * FXAA_QUALITY__P0; posN.x = posB.x - offNP.x * FXAA_QUALITY__P0;
posN.y = posB.y - offNP.y * FXAA_QUALITY__P0; posN.y = posB.y - offNP.y * FXAA_QUALITY__P0;
FxaaFloat2 posP; FxaaFloat2 posP;
posP.x = posB.x + offNP.x * FXAA_QUALITY__P0; posP.x = posB.x + offNP.x * FXAA_QUALITY__P0;
posP.y = posB.y + offNP.y * FXAA_QUALITY__P0; posP.y = posB.y + offNP.y * FXAA_QUALITY__P0;
FxaaFloat subpixD = ((-2.0)*subpixC) + 3.0; FxaaFloat subpixD = ((-2.0)*subpixC) + 3.0;
FxaaFloat lumaEndN = FxaaTexTop(lum, posN).x; FxaaFloat lumaEndN = FxaaTexTop(lum, posN).x;
FxaaFloat subpixE = subpixC * subpixC; FxaaFloat subpixE = subpixC * subpixC;
FxaaFloat lumaEndP = FxaaTexTop(lum, posP).x; FxaaFloat lumaEndP = FxaaTexTop(lum, posP).x;
if(!pairN) lumaNN = lumaSS; if(!pairN) lumaNN = lumaSS;
FxaaFloat gradientScaled = gradient * 1.0/4.0; FxaaFloat gradientScaled = gradient * 1.0/4.0;
FxaaFloat lumaMM = lumaM - lumaNN * 0.5; FxaaFloat lumaMM = lumaM - lumaNN * 0.5;
FxaaFloat subpixF = subpixD * subpixE; FxaaFloat subpixF = subpixD * subpixE;
FxaaBool lumaMLTZero = lumaMM < 0.0; FxaaBool lumaMLTZero = lumaMM < 0.0;
lumaEndN -= lumaNN * 0.5; lumaEndN -= lumaNN * 0.5;
lumaEndP -= lumaNN * 0.5; lumaEndP -= lumaNN * 0.5;
FxaaBool doneN = abs(lumaEndN) >= gradientScaled; FxaaBool doneN = abs(lumaEndN) >= gradientScaled;
FxaaBool doneP = abs(lumaEndP) >= gradientScaled; FxaaBool doneP = abs(lumaEndP) >= gradientScaled;
if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P1; if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P1;
if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P1; if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P1;
FxaaBool doneNP = (!doneN) || (!doneP); FxaaBool doneNP = (!doneN) || (!doneP);
if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P1; if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P1;
if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P1; if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P1;
if(doneNP) { if(doneNP) {
if(!doneN) lumaEndN = FxaaTexTop(lum, posN.xy).x; if(!doneN) lumaEndN = FxaaTexTop(lum, posN.xy).x;
if(!doneP) lumaEndP = FxaaTexTop(lum, posP.xy).x; if(!doneP) lumaEndP = FxaaTexTop(lum, posP.xy).x;
if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5; if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;
if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5; if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;
doneN = abs(lumaEndN) >= gradientScaled; doneN = abs(lumaEndN) >= gradientScaled;
doneP = abs(lumaEndP) >= gradientScaled; doneP = abs(lumaEndP) >= gradientScaled;
if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P2; if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P2;
if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P2; if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P2;
doneNP = (!doneN) || (!doneP); doneNP = (!doneN) || (!doneP);
if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P2; if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P2;
if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P2; if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P2;
#if (FXAA_QUALITY__PS > 3) #if (FXAA_QUALITY__PS > 3)
if(doneNP) { if(doneNP) {
if(!doneN) lumaEndN = FxaaTexTop(lum, posN.xy).x; if(!doneN) lumaEndN = FxaaTexTop(lum, posN.xy).x;
if(!doneP) lumaEndP = FxaaTexTop(lum, posP.xy).x; if(!doneP) lumaEndP = FxaaTexTop(lum, posP.xy).x;
if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5; if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;
if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5; if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;
doneN = abs(lumaEndN) >= gradientScaled; doneN = abs(lumaEndN) >= gradientScaled;
doneP = abs(lumaEndP) >= gradientScaled; doneP = abs(lumaEndP) >= gradientScaled;
if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P3; if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P3;
if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P3; if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P3;
doneNP = (!doneN) || (!doneP); doneNP = (!doneN) || (!doneP);
if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P3; if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P3;
if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P3; if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P3;
#if (FXAA_QUALITY__PS > 4) #if (FXAA_QUALITY__PS > 4)
if(doneNP) { if(doneNP) {
if(!doneN) lumaEndN = FxaaTexTop(lum, posN.xy).x; if(!doneN) lumaEndN = FxaaTexTop(lum, posN.xy).x;
if(!doneP) lumaEndP = FxaaTexTop(lum, posP.xy).x; if(!doneP) lumaEndP = FxaaTexTop(lum, posP.xy).x;
if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5; if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;
if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5; if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;
doneN = abs(lumaEndN) >= gradientScaled; doneN = abs(lumaEndN) >= gradientScaled;
doneP = abs(lumaEndP) >= gradientScaled; doneP = abs(lumaEndP) >= gradientScaled;
if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P4; if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P4;
if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P4; if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P4;
doneNP = (!doneN) || (!doneP); doneNP = (!doneN) || (!doneP);
if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P4; if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P4;
if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P4; if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P4;
#if (FXAA_QUALITY__PS > 5) #if (FXAA_QUALITY__PS > 5)
if(doneNP) { if(doneNP) {
if(!doneN) lumaEndN = FxaaTexTop(lum, posN.xy).x; if(!doneN) lumaEndN = FxaaTexTop(lum, posN.xy).x;
if(!doneP) lumaEndP = FxaaTexTop(lum, posP.xy).x; if(!doneP) lumaEndP = FxaaTexTop(lum, posP.xy).x;
if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5; if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;
if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5; if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;
doneN = abs(lumaEndN) >= gradientScaled; doneN = abs(lumaEndN) >= gradientScaled;
doneP = abs(lumaEndP) >= gradientScaled; doneP = abs(lumaEndP) >= gradientScaled;
if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P5; if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P5;
if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P5; if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P5;
doneNP = (!doneN) || (!doneP); doneNP = (!doneN) || (!doneP);
if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P5; if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P5;
if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P5; if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P5;
#if (FXAA_QUALITY__PS > 6) #if (FXAA_QUALITY__PS > 6)
if(doneNP) { if(doneNP) {
if(!doneN) lumaEndN = FxaaTexTop(lum, posN.xy).x; if(!doneN) lumaEndN = FxaaTexTop(lum, posN.xy).x;
if(!doneP) lumaEndP = FxaaTexTop(lum, posP.xy).x; if(!doneP) lumaEndP = FxaaTexTop(lum, posP.xy).x;
if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5; if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;
if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5; if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;
doneN = abs(lumaEndN) >= gradientScaled; doneN = abs(lumaEndN) >= gradientScaled;
doneP = abs(lumaEndP) >= gradientScaled; doneP = abs(lumaEndP) >= gradientScaled;
if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P6; if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P6;
if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P6; if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P6;
doneNP = (!doneN) || (!doneP); doneNP = (!doneN) || (!doneP);
if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P6; if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P6;
if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P6; if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P6;
#if (FXAA_QUALITY__PS > 7) #if (FXAA_QUALITY__PS > 7)
if(doneNP) { if(doneNP) {
if(!doneN) lumaEndN = FxaaTexTop(lum, posN.xy).x; if(!doneN) lumaEndN = FxaaTexTop(lum, posN.xy).x;
if(!doneP) lumaEndP = FxaaTexTop(lum, posP.xy).x; if(!doneP) lumaEndP = FxaaTexTop(lum, posP.xy).x;
if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5; if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;
if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5; if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;
doneN = abs(lumaEndN) >= gradientScaled; doneN = abs(lumaEndN) >= gradientScaled;
doneP = abs(lumaEndP) >= gradientScaled; doneP = abs(lumaEndP) >= gradientScaled;
if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P7; if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P7;
if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P7; if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P7;
doneNP = (!doneN) || (!doneP); doneNP = (!doneN) || (!doneP);
if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P7; if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P7;
if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P7; if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P7;
#if (FXAA_QUALITY__PS > 8) #if (FXAA_QUALITY__PS > 8)
if(doneNP) { if(doneNP) {
if(!doneN) lumaEndN = FxaaTexTop(lum, posN.xy).x; if(!doneN) lumaEndN = FxaaTexTop(lum, posN.xy).x;
if(!doneP) lumaEndP = FxaaTexTop(lum, posP.xy).x; if(!doneP) lumaEndP = FxaaTexTop(lum, posP.xy).x;
if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5; if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;
if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5; if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;
doneN = abs(lumaEndN) >= gradientScaled; doneN = abs(lumaEndN) >= gradientScaled;
doneP = abs(lumaEndP) >= gradientScaled; doneP = abs(lumaEndP) >= gradientScaled;
if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P8; if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P8;
if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P8; if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P8;
doneNP = (!doneN) || (!doneP); doneNP = (!doneN) || (!doneP);
if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P8; if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P8;
if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P8; if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P8;
#if (FXAA_QUALITY__PS > 9) #if (FXAA_QUALITY__PS > 9)
if(doneNP) { if(doneNP) {
if(!doneN) lumaEndN = FxaaTexTop(lum, posN.xy).x; if(!doneN) lumaEndN = FxaaTexTop(lum, posN.xy).x;
if(!doneP) lumaEndP = FxaaTexTop(lum, posP.xy).x; if(!doneP) lumaEndP = FxaaTexTop(lum, posP.xy).x;
if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5; if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;
if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5; if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;
doneN = abs(lumaEndN) >= gradientScaled; doneN = abs(lumaEndN) >= gradientScaled;
doneP = abs(lumaEndP) >= gradientScaled; doneP = abs(lumaEndP) >= gradientScaled;
if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P9; if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P9;
if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P9; if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P9;
doneNP = (!doneN) || (!doneP); doneNP = (!doneN) || (!doneP);
if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P9; if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P9;
if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P9; if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P9;
#if (FXAA_QUALITY__PS > 10) #if (FXAA_QUALITY__PS > 10)
if(doneNP) { if(doneNP) {
if(!doneN) lumaEndN = FxaaTexTop(lum, posN.xy).x; if(!doneN) lumaEndN = FxaaTexTop(lum, posN.xy).x;
if(!doneP) lumaEndP = FxaaTexTop(lum, posP.xy).x; if(!doneP) lumaEndP = FxaaTexTop(lum, posP.xy).x;
if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5; if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;
if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5; if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;
doneN = abs(lumaEndN) >= gradientScaled; doneN = abs(lumaEndN) >= gradientScaled;
doneP = abs(lumaEndP) >= gradientScaled; doneP = abs(lumaEndP) >= gradientScaled;
if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P10; if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P10;
if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P10; if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P10;
doneNP = (!doneN) || (!doneP); doneNP = (!doneN) || (!doneP);
if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P10; if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P10;
if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P10; if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P10;
#if (FXAA_QUALITY__PS > 11) #if (FXAA_QUALITY__PS > 11)
if(doneNP) { if(doneNP) {
if(!doneN) lumaEndN = FxaaTexTop(lum, posN.xy).x; if(!doneN) lumaEndN = FxaaTexTop(lum, posN.xy).x;
if(!doneP) lumaEndP = FxaaTexTop(lum, posP.xy).x; if(!doneP) lumaEndP = FxaaTexTop(lum, posP.xy).x;
if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5; if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;
if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5; if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;
doneN = abs(lumaEndN) >= gradientScaled; doneN = abs(lumaEndN) >= gradientScaled;
doneP = abs(lumaEndP) >= gradientScaled; doneP = abs(lumaEndP) >= gradientScaled;
if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P11; if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P11;
if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P11; if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P11;
doneNP = (!doneN) || (!doneP); doneNP = (!doneN) || (!doneP);
if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P11; if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P11;
if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P11; if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P11;
#if (FXAA_QUALITY__PS > 12) #if (FXAA_QUALITY__PS > 12)
if(doneNP) { if(doneNP) {
if(!doneN) lumaEndN = FxaaTexTop(lum, posN.xy).x; if(!doneN) lumaEndN = FxaaTexTop(lum, posN.xy).x;
if(!doneP) lumaEndP = FxaaTexTop(lum, posP.xy).x; if(!doneP) lumaEndP = FxaaTexTop(lum, posP.xy).x;
if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5; if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;
if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5; if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;
doneN = abs(lumaEndN) >= gradientScaled; doneN = abs(lumaEndN) >= gradientScaled;
doneP = abs(lumaEndP) >= gradientScaled; doneP = abs(lumaEndP) >= gradientScaled;
if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P12; if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P12;
if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P12; if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P12;
doneNP = (!doneN) || (!doneP); doneNP = (!doneN) || (!doneP);
if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P12; if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P12;
if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P12; if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P12;
} }
#endif #endif
} }
#endif #endif
} }
#endif #endif
} }
#endif #endif
} }
#endif #endif
} }
#endif #endif
} }
#endif #endif
} }
#endif #endif
} }
#endif #endif
} }
#endif #endif
} }
FxaaFloat dstN = posM.x - posN.x; FxaaFloat dstN = posM.x - posN.x;
FxaaFloat dstP = posP.x - posM.x; FxaaFloat dstP = posP.x - posM.x;
if(!horzSpan) dstN = posM.y - posN.y; if(!horzSpan) dstN = posM.y - posN.y;
if(!horzSpan) dstP = posP.y - posM.y; if(!horzSpan) dstP = posP.y - posM.y;
FxaaBool goodSpanN = (lumaEndN < 0.0) != lumaMLTZero; FxaaBool goodSpanN = (lumaEndN < 0.0) != lumaMLTZero;
FxaaFloat spanLength = (dstP + dstN); FxaaFloat spanLength = (dstP + dstN);
FxaaBool goodSpanP = (lumaEndP < 0.0) != lumaMLTZero; FxaaBool goodSpanP = (lumaEndP < 0.0) != lumaMLTZero;
FxaaFloat spanLengthRcp = 1.0/spanLength; FxaaFloat spanLengthRcp = 1.0/spanLength;
FxaaBool directionN = dstN < dstP; FxaaBool directionN = dstN < dstP;
FxaaFloat dst = min(dstN, dstP); FxaaFloat dst = min(dstN, dstP);
FxaaBool goodSpan = directionN ? goodSpanN : goodSpanP; FxaaBool goodSpan = directionN ? goodSpanN : goodSpanP;
FxaaFloat subpixG = subpixF * subpixF; FxaaFloat subpixG = subpixF * subpixF;
FxaaFloat pixelOffset = (dst * (-spanLengthRcp)) + 0.5; FxaaFloat pixelOffset = (dst * (-spanLengthRcp)) + 0.5;
FxaaFloat subpixH = subpixG * fxaaQualitySubpix; FxaaFloat subpixH = subpixG * fxaaQualitySubpix;
FxaaFloat pixelOffsetGood = goodSpan ? pixelOffset : 0.0; FxaaFloat pixelOffsetGood = goodSpan ? pixelOffset : 0.0;
FxaaFloat pixelOffsetSubpix = max(pixelOffsetGood, subpixH); FxaaFloat pixelOffsetSubpix = max(pixelOffsetGood, subpixH);
if(!horzSpan) posM.x += pixelOffsetSubpix * lengthSign; if(!horzSpan) posM.x += pixelOffsetSubpix * lengthSign;
if( horzSpan) posM.y += pixelOffsetSubpix * lengthSign; if( horzSpan) posM.y += pixelOffsetSubpix * lengthSign;
return FxaaFloat4(FxaaTexTop(tex, posM).xyz, lumaM); return FxaaFloat4(FxaaTexTop(tex, posM).xyz, lumaM);
} }
vec2 RcpFrame = vec2(1.0 / 1280.0, 1.0 / 720.0) * uf_fragCoordScale; vec2 RcpFrame = vec2(1.0 / 1280.0, 1.0 / 720.0) * uf_fragCoordScale;
void main() void main()
{ {
passPixelColor0 = FxaaPixelShader(passParameterSem2.xy, textureUnitPS0, textureUnitPS1, RcpFrame, Subpix, EdgeThreshold, EdgeThresholdMin); passPixelColor0 = FxaaPixelShader(passParameterSem2.xy, textureUnitPS0, textureUnitPS1, RcpFrame, Subpix, EdgeThreshold, EdgeThresholdMin);
} }

View File

@ -1,17 +1,17 @@
#version 420 #version 420
#extension GL_ARB_texture_gather : enable #extension GL_ARB_texture_gather : enable
// shader 58b8411478181d7f //inventory luminance // shader 58b8411478181d7f //inventory luminance
layout(binding = 0) uniform sampler2D textureUnitPS0; layout(binding = 0) uniform sampler2D textureUnitPS0;
layout(location = 0) in vec4 passParameterSem2; layout(location = 0) in vec4 passParameterSem2;
layout(location = 0) out vec4 passPixelColor0; layout(location = 0) out vec4 passPixelColor0;
uniform vec2 uf_fragCoordScale; uniform vec2 uf_fragCoordScale;
void main() void main()
{ {
vec3 R0f = texture(textureUnitPS0, passParameterSem2.xy).xyz; vec3 R0f = texture(textureUnitPS0, passParameterSem2.xy).xyz;
R0f.x = dot(R0f, vec3(0.299, 0.587, 0.114)); R0f.x = dot(R0f, vec3(0.299, 0.587, 0.114));
R0f.x = pow(R0f.x, 0.45); R0f.x = pow(R0f.x, 0.45);
// export // export
passPixelColor0 = vec4(R0f.x); passPixelColor0 = vec4(R0f.x);
} }

View File

@ -1,17 +1,17 @@
#version 420 #version 420
#extension GL_ARB_texture_gather : enable #extension GL_ARB_texture_gather : enable
// shader 58b84124c01721ff //in-game luminance // shader 58b84124c01721ff //in-game luminance
layout(binding = 0) uniform sampler2D textureUnitPS0; layout(binding = 0) uniform sampler2D textureUnitPS0;
layout(location = 0) in vec4 passParameterSem2; layout(location = 0) in vec4 passParameterSem2;
layout(location = 0) out vec4 passPixelColor0; layout(location = 0) out vec4 passPixelColor0;
uniform vec2 uf_fragCoordScale; uniform vec2 uf_fragCoordScale;
void main() void main()
{ {
vec3 R0f = texture(textureUnitPS0, passParameterSem2.xy).xyz; vec3 R0f = texture(textureUnitPS0, passParameterSem2.xy).xyz;
R0f.x = dot(R0f, vec3(0.299, 0.587, 0.114)); R0f.x = dot(R0f, vec3(0.299, 0.587, 0.114));
R0f.x = pow(R0f.x, 0.45); R0f.x = pow(R0f.x, 0.45);
// export // export
passPixelColor0 = vec4(R0f.x); passPixelColor0 = vec4(R0f.x);
} }

View File

@ -1,350 +1,350 @@
#version 420 #version 420
#extension GL_ARB_texture_gather : enable #extension GL_ARB_texture_gather : enable
/*-----------------------------settings-------------------------------------*/ /*-----------------------------settings-------------------------------------*/
#define Subpix 0.70 //[0.000 to 1.000] Choose the amount of sub-pixel aliasing removal. #define Subpix 0.70 //[0.000 to 1.000] Choose the amount of sub-pixel aliasing removal.
#define EdgeThreshold 0.125 //[0.000 to 1.000] Edge detection threshold. The minimum amount of local contrast required to apply algorithm. #define EdgeThreshold 0.125 //[0.000 to 1.000] Edge detection threshold. The minimum amount of local contrast required to apply algorithm.
#define EdgeThresholdMin 0.0625 //[0.000 to 1.000] Darkness threshold. Trims the algorithm from processing darks. #define EdgeThresholdMin 0.0625 //[0.000 to 1.000] Darkness threshold. Trims the algorithm from processing darks.
/*--------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------*/
// shader f14bb57cd5c9cb77 // shader f14bb57cd5c9cb77
// fxaa in game // fxaa in game
// original shader dumped using cemu 1.10.0f, BotW 1.3.1 // original shader dumped using cemu 1.10.0f, BotW 1.3.1
layout(binding = 0) uniform sampler2D textureUnitPS0; layout(binding = 0) uniform sampler2D textureUnitPS0;
layout(binding = 1) uniform sampler2D textureUnitPS1; layout(binding = 1) uniform sampler2D textureUnitPS1;
layout(location = 0) in vec4 passParameterSem2; layout(location = 0) in vec4 passParameterSem2;
layout(location = 0) out vec4 passPixelColor0; layout(location = 0) out vec4 passPixelColor0;
uniform vec2 uf_fragCoordScale; uniform vec2 uf_fragCoordScale;
#define FXAA_QUALITY__PS 12 #define FXAA_QUALITY__PS 12
#define FXAA_QUALITY__P0 1.0 #define FXAA_QUALITY__P0 1.0
#define FXAA_QUALITY__P1 1.0 #define FXAA_QUALITY__P1 1.0
#define FXAA_QUALITY__P2 1.0 #define FXAA_QUALITY__P2 1.0
#define FXAA_QUALITY__P3 1.0 #define FXAA_QUALITY__P3 1.0
#define FXAA_QUALITY__P4 1.0 #define FXAA_QUALITY__P4 1.0
#define FXAA_QUALITY__P5 1.5 #define FXAA_QUALITY__P5 1.5
#define FXAA_QUALITY__P6 2.0 #define FXAA_QUALITY__P6 2.0
#define FXAA_QUALITY__P7 2.0 #define FXAA_QUALITY__P7 2.0
#define FXAA_QUALITY__P8 2.0 #define FXAA_QUALITY__P8 2.0
#define FXAA_QUALITY__P9 2.0 #define FXAA_QUALITY__P9 2.0
#define FXAA_QUALITY__P10 4.0 #define FXAA_QUALITY__P10 4.0
#define FXAA_QUALITY__P11 8.0 #define FXAA_QUALITY__P11 8.0
#define FxaaBool bool #define FxaaBool bool
#define FxaaDiscard discard #define FxaaDiscard discard
#define FxaaFloat float #define FxaaFloat float
#define FxaaFloat2 vec2 #define FxaaFloat2 vec2
#define FxaaFloat3 vec3 #define FxaaFloat3 vec3
#define FxaaFloat4 vec4 #define FxaaFloat4 vec4
#define FxaaHalf float #define FxaaHalf float
#define FxaaHalf2 vec2 #define FxaaHalf2 vec2
#define FxaaHalf3 vec3 #define FxaaHalf3 vec3
#define FxaaHalf4 vec4 #define FxaaHalf4 vec4
#define FxaaInt2 ivec2 #define FxaaInt2 ivec2
#define FxaaSat(x) clamp(x, 0.0, 1.0) #define FxaaSat(x) clamp(x, 0.0, 1.0)
#define FxaaTex sampler2D #define FxaaTex sampler2D
#define FxaaTexTop(t, p) textureLod(t, p, 0.0) #define FxaaTexTop(t, p) textureLod(t, p, 0.0)
#define FxaaTexOff(t, p, o, r) textureLodOffset(t, p, 0.0, o) #define FxaaTexOff(t, p, o, r) textureLodOffset(t, p, 0.0, o)
#define FxaaTexAlpha4(t, p) textureGather(t, p, 3) #define FxaaTexAlpha4(t, p) textureGather(t, p, 3)
#define FxaaTexOffAlpha4(t, p, o) textureGatherOffset(t, p, o, 3) #define FxaaTexOffAlpha4(t, p, o) textureGatherOffset(t, p, o, 3)
#define FxaaTexGreen4(t, p) textureGather(t, p, 1) #define FxaaTexGreen4(t, p) textureGather(t, p, 1)
#define FxaaTexOffGreen4(t, p, o) textureGatherOffset(t, p, o, 1) #define FxaaTexOffGreen4(t, p, o) textureGatherOffset(t, p, o, 1)
FxaaFloat4 FxaaPixelShader( FxaaFloat4 FxaaPixelShader(
FxaaFloat2 pos, FxaaFloat2 pos,
FxaaTex tex, FxaaTex tex,
FxaaTex lum, FxaaTex lum,
FxaaFloat2 fxaaQualityRcpFrame, FxaaFloat2 fxaaQualityRcpFrame,
FxaaFloat fxaaQualitySubpix, FxaaFloat fxaaQualitySubpix,
FxaaFloat fxaaQualityEdgeThreshold, FxaaFloat fxaaQualityEdgeThreshold,
FxaaFloat fxaaQualityEdgeThresholdMin FxaaFloat fxaaQualityEdgeThresholdMin
) { ) {
FxaaFloat2 posM; FxaaFloat2 posM;
posM.x = pos.x; posM.x = pos.x;
posM.y = pos.y; posM.y = pos.y;
FxaaFloat4 rgbyM = vec4(FxaaTexTop(tex, posM).xyz, FxaaTexTop(lum, posM).x); FxaaFloat4 rgbyM = vec4(FxaaTexTop(tex, posM).xyz, FxaaTexTop(lum, posM).x);
#define lumaM rgbyM.w #define lumaM rgbyM.w
FxaaFloat4 luma4A = textureGather(lum, posM); FxaaFloat4 luma4A = textureGather(lum, posM);
FxaaFloat4 luma4B = textureGatherOffset(lum, posM, FxaaInt2(-1, -1)); FxaaFloat4 luma4B = textureGatherOffset(lum, posM, FxaaInt2(-1, -1));
#define lumaE luma4A.z #define lumaE luma4A.z
#define lumaS luma4A.x #define lumaS luma4A.x
#define lumaSE luma4A.y #define lumaSE luma4A.y
#define lumaNW luma4B.w #define lumaNW luma4B.w
#define lumaN luma4B.z #define lumaN luma4B.z
#define lumaW luma4B.x #define lumaW luma4B.x
FxaaFloat maxSM = max(lumaS, lumaM); FxaaFloat maxSM = max(lumaS, lumaM);
FxaaFloat minSM = min(lumaS, lumaM); FxaaFloat minSM = min(lumaS, lumaM);
FxaaFloat maxESM = max(lumaE, maxSM); FxaaFloat maxESM = max(lumaE, maxSM);
FxaaFloat minESM = min(lumaE, minSM); FxaaFloat minESM = min(lumaE, minSM);
FxaaFloat maxWN = max(lumaN, lumaW); FxaaFloat maxWN = max(lumaN, lumaW);
FxaaFloat minWN = min(lumaN, lumaW); FxaaFloat minWN = min(lumaN, lumaW);
FxaaFloat rangeMax = max(maxWN, maxESM); FxaaFloat rangeMax = max(maxWN, maxESM);
FxaaFloat rangeMin = min(minWN, minESM); FxaaFloat rangeMin = min(minWN, minESM);
FxaaFloat rangeMaxScaled = rangeMax * fxaaQualityEdgeThreshold; FxaaFloat rangeMaxScaled = rangeMax * fxaaQualityEdgeThreshold;
FxaaFloat range = rangeMax - rangeMin; FxaaFloat range = rangeMax - rangeMin;
FxaaFloat rangeMaxClamped = max(fxaaQualityEdgeThresholdMin, rangeMaxScaled); FxaaFloat rangeMaxClamped = max(fxaaQualityEdgeThresholdMin, rangeMaxScaled);
FxaaBool earlyExit = range < rangeMaxClamped; FxaaBool earlyExit = range < rangeMaxClamped;
if(earlyExit) if(earlyExit)
return rgbyM; return rgbyM;
FxaaFloat lumaNE = FxaaTexOff(lum, posM, FxaaInt2(1, -1), fxaaQualityRcpFrame.xy).x; FxaaFloat lumaNE = FxaaTexOff(lum, posM, FxaaInt2(1, -1), fxaaQualityRcpFrame.xy).x;
FxaaFloat lumaSW = FxaaTexOff(lum, posM, FxaaInt2(-1, 1), fxaaQualityRcpFrame.xy).x; FxaaFloat lumaSW = FxaaTexOff(lum, posM, FxaaInt2(-1, 1), fxaaQualityRcpFrame.xy).x;
FxaaFloat lumaNS = lumaN + lumaS; FxaaFloat lumaNS = lumaN + lumaS;
FxaaFloat lumaWE = lumaW + lumaE; FxaaFloat lumaWE = lumaW + lumaE;
FxaaFloat subpixRcpRange = 1.0/range; FxaaFloat subpixRcpRange = 1.0/range;
FxaaFloat subpixNSWE = lumaNS + lumaWE; FxaaFloat subpixNSWE = lumaNS + lumaWE;
FxaaFloat edgeHorz1 = (-2.0 * lumaM) + lumaNS; FxaaFloat edgeHorz1 = (-2.0 * lumaM) + lumaNS;
FxaaFloat edgeVert1 = (-2.0 * lumaM) + lumaWE; FxaaFloat edgeVert1 = (-2.0 * lumaM) + lumaWE;
FxaaFloat lumaNESE = lumaNE + lumaSE; FxaaFloat lumaNESE = lumaNE + lumaSE;
FxaaFloat lumaNWNE = lumaNW + lumaNE; FxaaFloat lumaNWNE = lumaNW + lumaNE;
FxaaFloat edgeHorz2 = (-2.0 * lumaE) + lumaNESE; FxaaFloat edgeHorz2 = (-2.0 * lumaE) + lumaNESE;
FxaaFloat edgeVert2 = (-2.0 * lumaN) + lumaNWNE; FxaaFloat edgeVert2 = (-2.0 * lumaN) + lumaNWNE;
FxaaFloat lumaNWSW = lumaNW + lumaSW; FxaaFloat lumaNWSW = lumaNW + lumaSW;
FxaaFloat lumaSWSE = lumaSW + lumaSE; FxaaFloat lumaSWSE = lumaSW + lumaSE;
FxaaFloat edgeHorz4 = (abs(edgeHorz1) * 2.0) + abs(edgeHorz2); FxaaFloat edgeHorz4 = (abs(edgeHorz1) * 2.0) + abs(edgeHorz2);
FxaaFloat edgeVert4 = (abs(edgeVert1) * 2.0) + abs(edgeVert2); FxaaFloat edgeVert4 = (abs(edgeVert1) * 2.0) + abs(edgeVert2);
FxaaFloat edgeHorz3 = (-2.0 * lumaW) + lumaNWSW; FxaaFloat edgeHorz3 = (-2.0 * lumaW) + lumaNWSW;
FxaaFloat edgeVert3 = (-2.0 * lumaS) + lumaSWSE; FxaaFloat edgeVert3 = (-2.0 * lumaS) + lumaSWSE;
FxaaFloat edgeHorz = abs(edgeHorz3) + edgeHorz4; FxaaFloat edgeHorz = abs(edgeHorz3) + edgeHorz4;
FxaaFloat edgeVert = abs(edgeVert3) + edgeVert4; FxaaFloat edgeVert = abs(edgeVert3) + edgeVert4;
FxaaFloat subpixNWSWNESE = lumaNWSW + lumaNESE; FxaaFloat subpixNWSWNESE = lumaNWSW + lumaNESE;
FxaaFloat lengthSign = fxaaQualityRcpFrame.x; FxaaFloat lengthSign = fxaaQualityRcpFrame.x;
FxaaBool horzSpan = edgeHorz >= edgeVert; FxaaBool horzSpan = edgeHorz >= edgeVert;
FxaaFloat subpixA = subpixNSWE * 2.0 + subpixNWSWNESE; FxaaFloat subpixA = subpixNSWE * 2.0 + subpixNWSWNESE;
if(!horzSpan) lumaN = lumaW; if(!horzSpan) lumaN = lumaW;
if(!horzSpan) lumaS = lumaE; if(!horzSpan) lumaS = lumaE;
if(horzSpan) lengthSign = fxaaQualityRcpFrame.y; if(horzSpan) lengthSign = fxaaQualityRcpFrame.y;
FxaaFloat subpixB = (subpixA * (1.0/12.0)) - lumaM; FxaaFloat subpixB = (subpixA * (1.0/12.0)) - lumaM;
FxaaFloat gradientN = lumaN - lumaM; FxaaFloat gradientN = lumaN - lumaM;
FxaaFloat gradientS = lumaS - lumaM; FxaaFloat gradientS = lumaS - lumaM;
FxaaFloat lumaNN = lumaN + lumaM; FxaaFloat lumaNN = lumaN + lumaM;
FxaaFloat lumaSS = lumaS + lumaM; FxaaFloat lumaSS = lumaS + lumaM;
FxaaBool pairN = abs(gradientN) >= abs(gradientS); FxaaBool pairN = abs(gradientN) >= abs(gradientS);
FxaaFloat gradient = max(abs(gradientN), abs(gradientS)); FxaaFloat gradient = max(abs(gradientN), abs(gradientS));
if(pairN) lengthSign = -lengthSign; if(pairN) lengthSign = -lengthSign;
FxaaFloat subpixC = FxaaSat(abs(subpixB) * subpixRcpRange); FxaaFloat subpixC = FxaaSat(abs(subpixB) * subpixRcpRange);
FxaaFloat2 posB; FxaaFloat2 posB;
posB.x = posM.x; posB.x = posM.x;
posB.y = posM.y; posB.y = posM.y;
FxaaFloat2 offNP; FxaaFloat2 offNP;
offNP.x = (!horzSpan) ? 0.0 : fxaaQualityRcpFrame.x; offNP.x = (!horzSpan) ? 0.0 : fxaaQualityRcpFrame.x;
offNP.y = ( horzSpan) ? 0.0 : fxaaQualityRcpFrame.y; offNP.y = ( horzSpan) ? 0.0 : fxaaQualityRcpFrame.y;
if(!horzSpan) posB.x += lengthSign * 0.5; if(!horzSpan) posB.x += lengthSign * 0.5;
if( horzSpan) posB.y += lengthSign * 0.5; if( horzSpan) posB.y += lengthSign * 0.5;
FxaaFloat2 posN; FxaaFloat2 posN;
posN.x = posB.x - offNP.x * FXAA_QUALITY__P0; posN.x = posB.x - offNP.x * FXAA_QUALITY__P0;
posN.y = posB.y - offNP.y * FXAA_QUALITY__P0; posN.y = posB.y - offNP.y * FXAA_QUALITY__P0;
FxaaFloat2 posP; FxaaFloat2 posP;
posP.x = posB.x + offNP.x * FXAA_QUALITY__P0; posP.x = posB.x + offNP.x * FXAA_QUALITY__P0;
posP.y = posB.y + offNP.y * FXAA_QUALITY__P0; posP.y = posB.y + offNP.y * FXAA_QUALITY__P0;
FxaaFloat subpixD = ((-2.0)*subpixC) + 3.0; FxaaFloat subpixD = ((-2.0)*subpixC) + 3.0;
FxaaFloat lumaEndN = FxaaTexTop(lum, posN).x; FxaaFloat lumaEndN = FxaaTexTop(lum, posN).x;
FxaaFloat subpixE = subpixC * subpixC; FxaaFloat subpixE = subpixC * subpixC;
FxaaFloat lumaEndP = FxaaTexTop(lum, posP).x; FxaaFloat lumaEndP = FxaaTexTop(lum, posP).x;
if(!pairN) lumaNN = lumaSS; if(!pairN) lumaNN = lumaSS;
FxaaFloat gradientScaled = gradient * 1.0/4.0; FxaaFloat gradientScaled = gradient * 1.0/4.0;
FxaaFloat lumaMM = lumaM - lumaNN * 0.5; FxaaFloat lumaMM = lumaM - lumaNN * 0.5;
FxaaFloat subpixF = subpixD * subpixE; FxaaFloat subpixF = subpixD * subpixE;
FxaaBool lumaMLTZero = lumaMM < 0.0; FxaaBool lumaMLTZero = lumaMM < 0.0;
lumaEndN -= lumaNN * 0.5; lumaEndN -= lumaNN * 0.5;
lumaEndP -= lumaNN * 0.5; lumaEndP -= lumaNN * 0.5;
FxaaBool doneN = abs(lumaEndN) >= gradientScaled; FxaaBool doneN = abs(lumaEndN) >= gradientScaled;
FxaaBool doneP = abs(lumaEndP) >= gradientScaled; FxaaBool doneP = abs(lumaEndP) >= gradientScaled;
if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P1; if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P1;
if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P1; if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P1;
FxaaBool doneNP = (!doneN) || (!doneP); FxaaBool doneNP = (!doneN) || (!doneP);
if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P1; if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P1;
if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P1; if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P1;
if(doneNP) { if(doneNP) {
if(!doneN) lumaEndN = FxaaTexTop(lum, posN.xy).x; if(!doneN) lumaEndN = FxaaTexTop(lum, posN.xy).x;
if(!doneP) lumaEndP = FxaaTexTop(lum, posP.xy).x; if(!doneP) lumaEndP = FxaaTexTop(lum, posP.xy).x;
if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5; if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;
if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5; if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;
doneN = abs(lumaEndN) >= gradientScaled; doneN = abs(lumaEndN) >= gradientScaled;
doneP = abs(lumaEndP) >= gradientScaled; doneP = abs(lumaEndP) >= gradientScaled;
if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P2; if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P2;
if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P2; if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P2;
doneNP = (!doneN) || (!doneP); doneNP = (!doneN) || (!doneP);
if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P2; if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P2;
if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P2; if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P2;
#if (FXAA_QUALITY__PS > 3) #if (FXAA_QUALITY__PS > 3)
if(doneNP) { if(doneNP) {
if(!doneN) lumaEndN = FxaaTexTop(lum, posN.xy).x; if(!doneN) lumaEndN = FxaaTexTop(lum, posN.xy).x;
if(!doneP) lumaEndP = FxaaTexTop(lum, posP.xy).x; if(!doneP) lumaEndP = FxaaTexTop(lum, posP.xy).x;
if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5; if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;
if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5; if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;
doneN = abs(lumaEndN) >= gradientScaled; doneN = abs(lumaEndN) >= gradientScaled;
doneP = abs(lumaEndP) >= gradientScaled; doneP = abs(lumaEndP) >= gradientScaled;
if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P3; if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P3;
if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P3; if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P3;
doneNP = (!doneN) || (!doneP); doneNP = (!doneN) || (!doneP);
if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P3; if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P3;
if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P3; if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P3;
#if (FXAA_QUALITY__PS > 4) #if (FXAA_QUALITY__PS > 4)
if(doneNP) { if(doneNP) {
if(!doneN) lumaEndN = FxaaTexTop(lum, posN.xy).x; if(!doneN) lumaEndN = FxaaTexTop(lum, posN.xy).x;
if(!doneP) lumaEndP = FxaaTexTop(lum, posP.xy).x; if(!doneP) lumaEndP = FxaaTexTop(lum, posP.xy).x;
if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5; if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;
if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5; if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;
doneN = abs(lumaEndN) >= gradientScaled; doneN = abs(lumaEndN) >= gradientScaled;
doneP = abs(lumaEndP) >= gradientScaled; doneP = abs(lumaEndP) >= gradientScaled;
if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P4; if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P4;
if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P4; if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P4;
doneNP = (!doneN) || (!doneP); doneNP = (!doneN) || (!doneP);
if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P4; if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P4;
if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P4; if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P4;
#if (FXAA_QUALITY__PS > 5) #if (FXAA_QUALITY__PS > 5)
if(doneNP) { if(doneNP) {
if(!doneN) lumaEndN = FxaaTexTop(lum, posN.xy).x; if(!doneN) lumaEndN = FxaaTexTop(lum, posN.xy).x;
if(!doneP) lumaEndP = FxaaTexTop(lum, posP.xy).x; if(!doneP) lumaEndP = FxaaTexTop(lum, posP.xy).x;
if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5; if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;
if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5; if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;
doneN = abs(lumaEndN) >= gradientScaled; doneN = abs(lumaEndN) >= gradientScaled;
doneP = abs(lumaEndP) >= gradientScaled; doneP = abs(lumaEndP) >= gradientScaled;
if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P5; if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P5;
if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P5; if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P5;
doneNP = (!doneN) || (!doneP); doneNP = (!doneN) || (!doneP);
if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P5; if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P5;
if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P5; if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P5;
#if (FXAA_QUALITY__PS > 6) #if (FXAA_QUALITY__PS > 6)
if(doneNP) { if(doneNP) {
if(!doneN) lumaEndN = FxaaTexTop(lum, posN.xy).x; if(!doneN) lumaEndN = FxaaTexTop(lum, posN.xy).x;
if(!doneP) lumaEndP = FxaaTexTop(lum, posP.xy).x; if(!doneP) lumaEndP = FxaaTexTop(lum, posP.xy).x;
if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5; if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;
if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5; if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;
doneN = abs(lumaEndN) >= gradientScaled; doneN = abs(lumaEndN) >= gradientScaled;
doneP = abs(lumaEndP) >= gradientScaled; doneP = abs(lumaEndP) >= gradientScaled;
if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P6; if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P6;
if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P6; if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P6;
doneNP = (!doneN) || (!doneP); doneNP = (!doneN) || (!doneP);
if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P6; if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P6;
if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P6; if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P6;
#if (FXAA_QUALITY__PS > 7) #if (FXAA_QUALITY__PS > 7)
if(doneNP) { if(doneNP) {
if(!doneN) lumaEndN = FxaaTexTop(lum, posN.xy).x; if(!doneN) lumaEndN = FxaaTexTop(lum, posN.xy).x;
if(!doneP) lumaEndP = FxaaTexTop(lum, posP.xy).x; if(!doneP) lumaEndP = FxaaTexTop(lum, posP.xy).x;
if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5; if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;
if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5; if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;
doneN = abs(lumaEndN) >= gradientScaled; doneN = abs(lumaEndN) >= gradientScaled;
doneP = abs(lumaEndP) >= gradientScaled; doneP = abs(lumaEndP) >= gradientScaled;
if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P7; if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P7;
if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P7; if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P7;
doneNP = (!doneN) || (!doneP); doneNP = (!doneN) || (!doneP);
if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P7; if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P7;
if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P7; if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P7;
#if (FXAA_QUALITY__PS > 8) #if (FXAA_QUALITY__PS > 8)
if(doneNP) { if(doneNP) {
if(!doneN) lumaEndN = FxaaTexTop(lum, posN.xy).x; if(!doneN) lumaEndN = FxaaTexTop(lum, posN.xy).x;
if(!doneP) lumaEndP = FxaaTexTop(lum, posP.xy).x; if(!doneP) lumaEndP = FxaaTexTop(lum, posP.xy).x;
if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5; if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;
if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5; if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;
doneN = abs(lumaEndN) >= gradientScaled; doneN = abs(lumaEndN) >= gradientScaled;
doneP = abs(lumaEndP) >= gradientScaled; doneP = abs(lumaEndP) >= gradientScaled;
if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P8; if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P8;
if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P8; if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P8;
doneNP = (!doneN) || (!doneP); doneNP = (!doneN) || (!doneP);
if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P8; if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P8;
if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P8; if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P8;
#if (FXAA_QUALITY__PS > 9) #if (FXAA_QUALITY__PS > 9)
if(doneNP) { if(doneNP) {
if(!doneN) lumaEndN = FxaaTexTop(lum, posN.xy).x; if(!doneN) lumaEndN = FxaaTexTop(lum, posN.xy).x;
if(!doneP) lumaEndP = FxaaTexTop(lum, posP.xy).x; if(!doneP) lumaEndP = FxaaTexTop(lum, posP.xy).x;
if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5; if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;
if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5; if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;
doneN = abs(lumaEndN) >= gradientScaled; doneN = abs(lumaEndN) >= gradientScaled;
doneP = abs(lumaEndP) >= gradientScaled; doneP = abs(lumaEndP) >= gradientScaled;
if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P9; if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P9;
if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P9; if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P9;
doneNP = (!doneN) || (!doneP); doneNP = (!doneN) || (!doneP);
if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P9; if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P9;
if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P9; if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P9;
#if (FXAA_QUALITY__PS > 10) #if (FXAA_QUALITY__PS > 10)
if(doneNP) { if(doneNP) {
if(!doneN) lumaEndN = FxaaTexTop(lum, posN.xy).x; if(!doneN) lumaEndN = FxaaTexTop(lum, posN.xy).x;
if(!doneP) lumaEndP = FxaaTexTop(lum, posP.xy).x; if(!doneP) lumaEndP = FxaaTexTop(lum, posP.xy).x;
if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5; if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;
if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5; if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;
doneN = abs(lumaEndN) >= gradientScaled; doneN = abs(lumaEndN) >= gradientScaled;
doneP = abs(lumaEndP) >= gradientScaled; doneP = abs(lumaEndP) >= gradientScaled;
if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P10; if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P10;
if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P10; if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P10;
doneNP = (!doneN) || (!doneP); doneNP = (!doneN) || (!doneP);
if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P10; if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P10;
if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P10; if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P10;
#if (FXAA_QUALITY__PS > 11) #if (FXAA_QUALITY__PS > 11)
if(doneNP) { if(doneNP) {
if(!doneN) lumaEndN = FxaaTexTop(lum, posN.xy).x; if(!doneN) lumaEndN = FxaaTexTop(lum, posN.xy).x;
if(!doneP) lumaEndP = FxaaTexTop(lum, posP.xy).x; if(!doneP) lumaEndP = FxaaTexTop(lum, posP.xy).x;
if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5; if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;
if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5; if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;
doneN = abs(lumaEndN) >= gradientScaled; doneN = abs(lumaEndN) >= gradientScaled;
doneP = abs(lumaEndP) >= gradientScaled; doneP = abs(lumaEndP) >= gradientScaled;
if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P11; if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P11;
if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P11; if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P11;
doneNP = (!doneN) || (!doneP); doneNP = (!doneN) || (!doneP);
if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P11; if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P11;
if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P11; if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P11;
#if (FXAA_QUALITY__PS > 12) #if (FXAA_QUALITY__PS > 12)
if(doneNP) { if(doneNP) {
if(!doneN) lumaEndN = FxaaTexTop(lum, posN.xy).x; if(!doneN) lumaEndN = FxaaTexTop(lum, posN.xy).x;
if(!doneP) lumaEndP = FxaaTexTop(lum, posP.xy).x; if(!doneP) lumaEndP = FxaaTexTop(lum, posP.xy).x;
if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5; if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;
if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5; if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;
doneN = abs(lumaEndN) >= gradientScaled; doneN = abs(lumaEndN) >= gradientScaled;
doneP = abs(lumaEndP) >= gradientScaled; doneP = abs(lumaEndP) >= gradientScaled;
if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P12; if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P12;
if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P12; if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P12;
doneNP = (!doneN) || (!doneP); doneNP = (!doneN) || (!doneP);
if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P12; if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P12;
if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P12; if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P12;
} }
#endif #endif
} }
#endif #endif
} }
#endif #endif
} }
#endif #endif
} }
#endif #endif
} }
#endif #endif
} }
#endif #endif
} }
#endif #endif
} }
#endif #endif
} }
#endif #endif
} }
FxaaFloat dstN = posM.x - posN.x; FxaaFloat dstN = posM.x - posN.x;
FxaaFloat dstP = posP.x - posM.x; FxaaFloat dstP = posP.x - posM.x;
if(!horzSpan) dstN = posM.y - posN.y; if(!horzSpan) dstN = posM.y - posN.y;
if(!horzSpan) dstP = posP.y - posM.y; if(!horzSpan) dstP = posP.y - posM.y;
FxaaBool goodSpanN = (lumaEndN < 0.0) != lumaMLTZero; FxaaBool goodSpanN = (lumaEndN < 0.0) != lumaMLTZero;
FxaaFloat spanLength = (dstP + dstN); FxaaFloat spanLength = (dstP + dstN);
FxaaBool goodSpanP = (lumaEndP < 0.0) != lumaMLTZero; FxaaBool goodSpanP = (lumaEndP < 0.0) != lumaMLTZero;
FxaaFloat spanLengthRcp = 1.0/spanLength; FxaaFloat spanLengthRcp = 1.0/spanLength;
FxaaBool directionN = dstN < dstP; FxaaBool directionN = dstN < dstP;
FxaaFloat dst = min(dstN, dstP); FxaaFloat dst = min(dstN, dstP);
FxaaBool goodSpan = directionN ? goodSpanN : goodSpanP; FxaaBool goodSpan = directionN ? goodSpanN : goodSpanP;
FxaaFloat subpixG = subpixF * subpixF; FxaaFloat subpixG = subpixF * subpixF;
FxaaFloat pixelOffset = (dst * (-spanLengthRcp)) + 0.5; FxaaFloat pixelOffset = (dst * (-spanLengthRcp)) + 0.5;
FxaaFloat subpixH = subpixG * fxaaQualitySubpix; FxaaFloat subpixH = subpixG * fxaaQualitySubpix;
FxaaFloat pixelOffsetGood = goodSpan ? pixelOffset : 0.0; FxaaFloat pixelOffsetGood = goodSpan ? pixelOffset : 0.0;
FxaaFloat pixelOffsetSubpix = max(pixelOffsetGood, subpixH); FxaaFloat pixelOffsetSubpix = max(pixelOffsetGood, subpixH);
if(!horzSpan) posM.x += pixelOffsetSubpix * lengthSign; if(!horzSpan) posM.x += pixelOffsetSubpix * lengthSign;
if( horzSpan) posM.y += pixelOffsetSubpix * lengthSign; if( horzSpan) posM.y += pixelOffsetSubpix * lengthSign;
return FxaaFloat4(FxaaTexTop(tex, posM).xyz, lumaM); return FxaaFloat4(FxaaTexTop(tex, posM).xyz, lumaM);
} }
vec2 RcpFrame = vec2(1.0 / 1280.0, 1.0 / 720.0) * uf_fragCoordScale; vec2 RcpFrame = vec2(1.0 / 1280.0, 1.0 / 720.0) * uf_fragCoordScale;
void main() void main()
{ {
passPixelColor0 = FxaaPixelShader(passParameterSem2.xy, textureUnitPS0, textureUnitPS1, RcpFrame, Subpix, EdgeThreshold, EdgeThresholdMin); passPixelColor0 = FxaaPixelShader(passParameterSem2.xy, textureUnitPS0, textureUnitPS1, RcpFrame, Subpix, EdgeThreshold, EdgeThresholdMin);
} }

View File

@ -1,39 +1,39 @@
[Definition] [Definition]
titleIds = 00050000101C9300,00050000101C9400,00050000101C9500 titleIds = 00050000101C9300,00050000101C9400,00050000101C9500
name = "The Legend of Zelda: Breath of the Wild - FXAA" name = "The Legend of Zelda: Breath of the Wild - FXAA"
version = 2 version = 2
# Subpix: # Subpix:
# Choose the amount of sub-pixel aliasing removal. # Choose the amount of sub-pixel aliasing removal.
# This can affect sharpness. # This can affect sharpness.
# 1.00 - upper limit (softer) # 1.00 - upper limit (softer)
# 0.75 - default amount of filtering # 0.75 - default amount of filtering
# 0.50 - lower limit (sharper, less sub-pixel aliasing removal) # 0.50 - lower limit (sharper, less sub-pixel aliasing removal)
# 0.25 - almost off # 0.25 - almost off
# 0.00 - completely off # 0.00 - completely off
# EdgeThreshold: # EdgeThreshold:
# The minimum amount of local contrast required to apply algorithm. # The minimum amount of local contrast required to apply algorithm.
# 0.333 - too little (faster) # 0.333 - too little (faster)
# 0.250 - low quality # 0.250 - low quality
# 0.166 - default # 0.166 - default
# 0.125 - high quality # 0.125 - high quality
# 0.063 - overkill (slower) # 0.063 - overkill (slower)
# EdgeThresholdMin: # EdgeThresholdMin:
# Trims the algorithm from processing darks. # Trims the algorithm from processing darks.
# 0.0833 - upper limit (default, the start of visible unfiltered edges) # 0.0833 - upper limit (default, the start of visible unfiltered edges)
# 0.0625 - high quality (faster) # 0.0625 - high quality (faster)
# 0.0312 - visible limit (slower) # 0.0312 - visible limit (slower)
# Credit: Kiri, NAVras # Credit: Kiri, NAVras
[TextureRedefine] #Luma [TextureRedefine] #Luma
width = 1280 width = 1280
height = 720 height = 720
formats = 0x1 formats = 0x1
overwriteFormat = 0x5 overwriteFormat = 0x5
tileModesExcluded = 0x001 tileModesExcluded = 0x001