1#version 450 core 2#extension GL_ARB_separate_shader_objects : enable 3#extension GL_ARB_shading_language_420pack : enable 4 5// includes 6 7#include "render/shaders/common/render_color_conversion_common.h" 8#include "render/shaders/common/render_post_process_common.h" 9#include "render/shaders/common/render_tonemap_common.h" 10 11#define G3D_FXAA_PATCHES 1 12#define FXAA_PC_CONSOLE 1 13#define FXAA_GLSL_130 1 14#define FXAA_GREEN_AS_LUMA 1 15#include "common/fxaa_reference.h" 16 17// sets 18 19#include "render/shaders/common/render_post_process_layout_common.h" 20 21layout(set = 1, binding = 0) uniform texture2D uTex; 22#if (FXAA_GREEN_AS_LUMA == 0) 23layout(set = 1, binding = 1) uniform texture2D uTexAlpha; 24layout(set = 1, binding = 2) uniform sampler uSampler; 25#else 26layout(set = 1, binding = 1) uniform sampler uSampler; 27#endif 28 29// in / out 30 31layout(location = 0) in vec2 inUv; 32 33layout(location = 0) out vec4 outColor; 34 35float GetFxaaSharpness(const uint sharpness) 36{ 37 // enum Sharpness { SOFT = 0, MEDIUM = 1, SHARP = 2 }; 38 if (sharpness == 0u) { 39 return 2.0f; 40 } else if (sharpness == 1u) { 41 return 4.0f; 42 } else { // SHARP 43 return 8.0f; 44 } 45} 46 47vec2 GetFxaaThreshold(const uint quality) 48{ 49 // enum Quality { LOW = 0, MEDIUM = 1, HIGH = 2 }; 50 if (quality == 0u) { 51 return vec2(0.333f, 0.0833f); 52 } else if (quality == 1u) { 53 return vec2(0.125f, 0.0312f); 54 } else { // HIGH 55 return vec2(0.063f, 0.0625f); 56 } 57} 58 59void main(void) 60{ 61 const uint sharpness = uint(uPc.factor.x + 0.5f); 62 const float fxaaSharpness = GetFxaaSharpness(sharpness); 63 64 const uint quality = uint(uPc.factor.y + 0.5f); 65 const vec2 fxaaThreshold = GetFxaaThreshold(quality); 66 67 const vec2 textureSizeInv = uPc.viewportSizeInvSize.zw; 68 const vec2 texelCenter = inUv; 69 70 const vec4 aaPixel = FxaaPixelShader(texelCenter, // FxaaFloat2 pos 71 vec4(texelCenter - textureSizeInv.xy * 0.5, 72 texelCenter + textureSizeInv.xy * 0.5), // FxaaFloat4 fxaaConsolePosPos 73 uTex, // FxaaTex tex 74 uSampler, // FxaaSampler samp 75 vec2(0), // unused FxaaFloat2 fxaaQualityRcpFrame 76 vec4(-textureSizeInv.xy, textureSizeInv.xy), // FxaaFloat4 fxaaConsoleRcpFrameOpt, 77 2 * vec4(-textureSizeInv.xy, textureSizeInv.xy), // FxaaFloat4 fxaaConsoleRcpFrameOpt2, 78 vec4(0), // unused FxaaFloat4 fxaaConsole360RcpFrameOpt2, 79 0, // unused FxaaFloat fxaaQualitySubpix, on the range [0 no subpixel filtering but sharp to 1 maximum and 80 // blurry, .75 default] 81 0, // unused FxaaFloat fxaaQualityEdgeThreshold, on the range [0.063 (slow, overkill, good) to 0.333 (fast), 82 // 0.125 default] 83 0, // unused FxaaFloat fxaaQualityEdgeThresholdMin, on the range [0.0833 (fast) to 0.0312 (good), with 0.0625 84 // called "high quality"] 85 fxaaSharpness, // FxaaFloat fxaaConsoleEdgeSharpness, // 8.0 is sharper, 4.0 is softer, 2.0 is really soft (good 86 // for vector graphics inputs) 87 fxaaThreshold.x, // FxaaFloat fxaaConsoleEdgeThreshold, on the range [0.063 (slow, overkill, good) to 0.333 88 // (fast), 0.125 default] 89 fxaaThreshold.y, // FxaaFloat fxaaConsoleEdgeThresholdMin, on the range [0.0833 (fast) to 0.0312 (good), with 90 // 0.0625 called "high quality"] 91 vec4(0) // unused FxaaFloat4 fxaaConsole360ConstDir 92 ); 93#if (FXAA_GREEN_AS_LUMA == 0) 94 // luma is in uTex alpha, alpha is in separate texture 95 const float alpha = textureLod(sampler2D(uTexAlpha, uSampler), inUv, 0).x; 96 97 outColor = vec4((aaPixel.xyz), alpha); 98#else 99 outColor = aaPixel; 100#endif 101} 102