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