From c1006bd0ff669bbed65a400b47fb3a9dcd991035 Mon Sep 17 00:00:00 2001 From: Connor McLaughlin Date: Sun, 13 Sep 2020 18:50:40 +1000 Subject: [PATCH] PostProcessing: Allow fragment coordinate access from shader --- src/core/shadergen.cpp | 1 + src/frontend-common/postprocessing_shadergen.cpp | 9 ++++++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/core/shadergen.cpp b/src/core/shadergen.cpp index 9e32e3e90..d6cea2446 100644 --- a/src/core/shadergen.cpp +++ b/src/core/shadergen.cpp @@ -156,6 +156,7 @@ void ShaderGen::WriteHeader(std::stringstream& ss) ss << "#define HLSL 1\n"; ss << "#define roundEven round\n"; ss << "#define mix lerp\n"; + ss << "#define fract frac\n"; ss << "#define CONSTANT static const\n"; ss << "#define VECTOR_EQ(a, b) (all((a) == (b)))\n"; ss << "#define VECTOR_NEQ(a, b) (any((a) != (b)))\n"; diff --git a/src/frontend-common/postprocessing_shadergen.cpp b/src/frontend-common/postprocessing_shadergen.cpp index 2aac77ad0..640c7b7f2 100644 --- a/src/frontend-common/postprocessing_shadergen.cpp +++ b/src/frontend-common/postprocessing_shadergen.cpp @@ -48,10 +48,12 @@ std::string PostProcessingShaderGen::GeneratePostProcessingFragmentShader(const ss << R"( #define main real_main static float2 v_tex0; +static float4 v_pos; static float4 o_col0; // Wrappers for sampling functions. #define texture(sampler, coords) sampler.Sample(sampler##_ss, coords) #define textureOffset(sampler, coords, offset) sampler.Sample(sampler##_ss, coords, offset) +#define gl_FragCoord v_pos )"; } else @@ -84,6 +86,10 @@ static float4 o_col0; float4 Sample() { return texture(samp0, v_tex0); } float4 SampleLocation(float2 location) { return texture(samp0, location); } #define SampleOffset(offset) textureOffset(samp0, v_tex0, offset) +float2 GetFragCoord() +{ + return gl_FragCoord.xy; +} float2 GetWindowResolution() { return window_resolution; @@ -118,8 +124,9 @@ void SetOutput(float4 color) { ss << R"( #undef main -void main(in float2 v_tex0_ : TEXCOORD0, out float4 o_col0_ : SV_Target) +void main(in float2 v_tex0_ : TEXCOORD0, in float4 v_pos_ : SV_Position, out float4 o_col0_ : SV_Target) { + v_pos = v_pos_; v_tex0 = v_tex0_; real_main(); o_col0_ = o_col0;