diff --git a/engine/src/core-data/Common/MatDefs/Post/FXAA.frag b/engine/src/core-data/Common/MatDefs/Post/FXAA.frag index 679e9d2cf..b54e1b442 100644 --- a/engine/src/core-data/Common/MatDefs/Post/FXAA.frag +++ b/engine/src/core-data/Common/MatDefs/Post/FXAA.frag @@ -1,73 +1,79 @@ -#extension GL_EXT_gpu_shader4 : enable +///#extension GL_EXT_gpu_shader4 : disable +#extension all : disable + uniform sampler2D m_Texture; uniform vec2 g_Resolution; -varying vec2 texCoord; + uniform float m_VxOffset; uniform float m_SpanMax; uniform float m_ReduceMul; + +varying vec2 texCoord; varying vec4 posPos; -#define FxaaInt2 ivec2 -#define FxaaFloat2 vec2 -#define FxaaTexLod0(t, p) texture2DLod(t, p, 0.0) -#define FxaaTexOff(t, p, o, r) texture2DLodOffset(t, p, 0.0, o) + +#define FxaaTexLod0(t, p) textureLod(t, p, 0.0) +#define FxaaTexOff(t, p, o, r) textureLodOffset(t, p, 0.0, o) + vec3 FxaaPixelShader( - vec4 posPos, // Output of FxaaVertexShader interpolated across screen. + vec4 posPos, // Output of FxaaVertexShader interpolated across screen. sampler2D tex, // Input texture. vec2 rcpFrame) // Constant {1.0/frameWidth, 1.0/frameHeight}. { -/*---------------------------------------------------------*/ + #define FXAA_REDUCE_MIN (1.0/128.0) //#define FXAA_REDUCE_MUL (1.0/8.0) //#define FXAA_SPAN_MAX 8.0 -/*---------------------------------------------------------*/ + vec3 rgbNW = FxaaTexLod0(tex, posPos.zw).xyz; - vec3 rgbNE = FxaaTexOff(tex, posPos.zw, FxaaInt2(1,0), rcpFrame.xy).xyz; - vec3 rgbSW = FxaaTexOff(tex, posPos.zw, FxaaInt2(0,1), rcpFrame.xy).xyz; - vec3 rgbSE = FxaaTexOff(tex, posPos.zw, FxaaInt2(1,1), rcpFrame.xy).xyz; + vec3 rgbNE = FxaaTexOff(tex, posPos.zw, ivec2(1,0), rcpFrame.xy).xyz; + vec3 rgbSW = FxaaTexOff(tex, posPos.zw, ivec2(0,1), rcpFrame.xy).xyz; + vec3 rgbSE = FxaaTexOff(tex, posPos.zw, ivec2(1,1), rcpFrame.xy).xyz; + vec3 rgbM = FxaaTexLod0(tex, posPos.xy).xyz; -/*---------------------------------------------------------*/ + vec3 luma = vec3(0.299, 0.587, 0.114); float lumaNW = dot(rgbNW, luma); float lumaNE = dot(rgbNE, luma); float lumaSW = dot(rgbSW, luma); float lumaSE = dot(rgbSE, luma); float lumaM = dot(rgbM, luma); -/*---------------------------------------------------------*/ + float lumaMin = min(lumaM, min(min(lumaNW, lumaNE), min(lumaSW, lumaSE))); float lumaMax = max(lumaM, max(max(lumaNW, lumaNE), max(lumaSW, lumaSE))); -/*---------------------------------------------------------*/ + vec2 dir; dir.x = -((lumaNW + lumaNE) - (lumaSW + lumaSE)); dir.y = ((lumaNW + lumaSW) - (lumaNE + lumaSE)); -/*---------------------------------------------------------*/ + float dirReduce = max( (lumaNW + lumaNE + lumaSW + lumaSE) * (0.25 * m_ReduceMul), FXAA_REDUCE_MIN); float rcpDirMin = 1.0/(min(abs(dir.x), abs(dir.y)) + dirReduce); - dir = min(FxaaFloat2( m_SpanMax, m_SpanMax), - max(FxaaFloat2(-m_SpanMax, -m_SpanMax), + dir = min(vec2( m_SpanMax, m_SpanMax), + max(vec2(-m_SpanMax, -m_SpanMax), dir * rcpDirMin)) * rcpFrame.xy; -/*--------------------------------------------------------*/ + vec3 rgbA = (1.0/2.0) * ( - FxaaTexLod0(tex, posPos.xy + dir * (1.0/3.0 - 0.5)).xyz + - FxaaTexLod0(tex, posPos.xy + dir * (2.0/3.0 - 0.5)).xyz); + FxaaTexLod0(tex, posPos.xy + dir * vec2(1.0/3.0 - 0.5)).xyz + + FxaaTexLod0(tex, posPos.xy + dir * vec2(2.0/3.0 - 0.5)).xyz); vec3 rgbB = rgbA * (1.0/2.0) + (1.0/4.0) * ( - FxaaTexLod0(tex, posPos.xy + dir * (0.0/3.0 - 0.5)).xyz + - FxaaTexLod0(tex, posPos.xy + dir * (3.0/3.0 - 0.5)).xyz); + FxaaTexLod0(tex, posPos.xy + dir * vec2(0.0/3.0 - 0.5)).xyz + + FxaaTexLod0(tex, posPos.xy + dir * vec2(3.0/3.0 - 0.5)).xyz); + float lumaB = dot(rgbB, luma); - if((lumaB < lumaMin) || (lumaB > lumaMax)) return rgbA; - return rgbB; } -vec4 PostFX(sampler2D tex, vec2 uv, float time) -{ - vec4 c = vec4(0.0); - vec2 rcpFrame = vec2(1.0/g_Resolution.x, 1.0/g_Resolution.y); - c.rgb = FxaaPixelShader(posPos, tex, rcpFrame); - //c.rgb = 1.0 - texture2D(tex, posPos.xy).rgb; - c.a = 1.0; - return c; + + if ((lumaB < lumaMin) || (lumaB > lumaMax)) + { + return rgbA; + } + else + { + return rgbB; + } } + void main() { - vec2 uv = texCoord.st; - gl_FragColor = PostFX(m_Texture, uv, 0.0); + vec2 rcpFrame = vec2(1.0) / g_Resolution; + gl_FragColor = vec4(FxaaPixelShader(posPos, m_Texture, rcpFrame), 1.0); } \ No newline at end of file diff --git a/engine/src/core-data/Common/MatDefs/Post/FXAA.j3md b/engine/src/core-data/Common/MatDefs/Post/FXAA.j3md index 78fff9374..cfe239e7c 100644 --- a/engine/src/core-data/Common/MatDefs/Post/FXAA.j3md +++ b/engine/src/core-data/Common/MatDefs/Post/FXAA.j3md @@ -9,7 +9,7 @@ MaterialDef FXAA { } Technique { VertexShader GLSL100: Common/MatDefs/Post/FXAA.vert - FragmentShader GLSL120: Common/MatDefs/Post/FXAA.frag + FragmentShader GLSL130: Common/MatDefs/Post/FXAA.frag WorldParameters { WorldViewProjectionMatrix Resolution diff --git a/engine/src/core-data/Common/MatDefs/Post/FXAA.vert b/engine/src/core-data/Common/MatDefs/Post/FXAA.vert index f4ba2e328..2390384a7 100644 --- a/engine/src/core-data/Common/MatDefs/Post/FXAA.vert +++ b/engine/src/core-data/Common/MatDefs/Post/FXAA.vert @@ -1,15 +1,18 @@ uniform mat4 g_WorldViewProjectionMatrix; uniform vec2 g_Resolution; + +uniform float m_SubPixelShift; + attribute vec4 inPosition; attribute vec2 inTexCoord; + varying vec2 texCoord; -uniform float m_SubPixelShift; varying vec4 posPos; + void main() { gl_Position = inPosition * 2.0 - 1.0; //vec4(pos, 0.0, 1.0); texCoord = inTexCoord; - vec2 rcpFrame = vec2(1.0/g_Resolution.x, 1.0/g_Resolution.y); + vec2 rcpFrame = vec2(1.0) / g_Resolution; posPos.xy = inTexCoord.xy; - posPos.zw = inTexCoord.xy - - (rcpFrame * (0.5 + m_SubPixelShift)); + posPos.zw = inTexCoord.xy - (rcpFrame * vec2(0.5 + m_SubPixelShift)); } \ No newline at end of file