diff --git a/fsr/fsr.slangp b/fsr/fsr.slangp index d72a9a8..dcbce21 100644 --- a/fsr/fsr.slangp +++ b/fsr/fsr.slangp @@ -10,6 +10,8 @@ filter_linear1 = true scale_type1 = source scale1 = 1.0 -parameters = "FSR_SHARPENING;FSR_FILMGRAIN" +parameters = "FSR_SHARPENING;FSR_FILMGRAIN;FSR_GRAINCOLOR;FSR_GRAINPDF" FSR_SHARPENING = 0.3 -FSR_FILMGRAIN = 0.10 +FSR_FILMGRAIN = 0.3 +FSR_GRAINCOLOR = 1.0 +FSR_GRAINPDF = 0.3 diff --git a/fsr/shaders/fsr-pass0.slang b/fsr/shaders/fsr-pass0.slang index 6abf481..b0028ba 100644 --- a/fsr/shaders/fsr-pass0.slang +++ b/fsr/shaders/fsr-pass0.slang @@ -1,4 +1,5 @@ #version 450 +// SPDX-License-Identifier: Unlicense #pragma name FSR_EASU // FSR - [EASU] EDGE ADAPTIVE SPATIAL UPSAMPLING @@ -40,15 +41,9 @@ layout(set = 0, binding = 2) uniform sampler2D Source; #define FSR_EASU_F 1 AU4 con0, con1, con2, con3; -AF4 FsrEasuRF(AF2 p) { - return textureGather(Source, p, 0); -} -AF4 FsrEasuGF(AF2 p) { - return textureGather(Source, p, 1); -} -AF4 FsrEasuBF(AF2 p) { - return textureGather(Source, p, 2); -} +AF4 FsrEasuRF(AF2 p) { return textureGather(Source, p, 0); } +AF4 FsrEasuGF(AF2 p) { return textureGather(Source, p, 1); } +AF4 FsrEasuBF(AF2 p) { return textureGather(Source, p, 2); } #include "ffx_fsr1.h" diff --git a/fsr/shaders/fsr-pass1.slang b/fsr/shaders/fsr-pass1.slang index 5574444..d9537ab 100644 --- a/fsr/shaders/fsr-pass1.slang +++ b/fsr/shaders/fsr-pass1.slang @@ -1,4 +1,5 @@ #version 450 +// SPDX-License-Identifier: Unlicense #pragma name FSR_RCAS // FSR - [RCAS] ROBUST CONTRAST ADAPTIVE SHARPENING @@ -8,7 +9,9 @@ // scale1 = 1.0 #pragma parameter FSR_SHARPENING "FSR RCAS Sharpening Amount (Lower = Sharper)" 0.2 0.0 2.0 0.1 -#pragma parameter FSR_FILMGRAIN "FSR LFGA Film Grain Intensity" 0.10 0.0 1.0 0.02 +#pragma parameter FSR_FILMGRAIN "FSR LFGA Film Grain Intensity" 0.3 0.0 2.0 0.02 +#pragma parameter FSR_GRAINCOLOR "FSR LFGA Film Grain Color: Gray | RGB" 1.0 0.0 1.0 1.0 +#pragma parameter FSR_GRAINPDF "FSR LFGA Grain PDF Curve (0.5 = Triangular, Lower = Gaussian)" 0.3 0.1 0.5 0.05 layout(push_constant) uniform Push { vec4 SourceSize; @@ -17,6 +20,8 @@ layout(push_constant) uniform Push { uint FrameCount; float FSR_SHARPENING; float FSR_FILMGRAIN; + float FSR_GRAINCOLOR; + float FSR_GRAINPDF; } params; layout(std140, set = 0, binding = 0) uniform UBO { @@ -45,14 +50,31 @@ layout(set = 0, binding = 2) uniform sampler2D Source; #define FSR_RCAS_F 1 AU4 con0; -AF4 FsrRcasLoadF(ASU2 p) { - return AF4(texelFetch(Source, ASU2(p), 0)); -} - +AF4 FsrRcasLoadF(ASU2 p) { return AF4(texelFetch(Source, p, 0)); } void FsrRcasInputF(inout AF1 r, inout AF1 g, inout AF1 b) {} #include "ffx_fsr1.h" +// prng: A simple but effective pseudo-random number generator [0;1[ +float prng(vec2 uv, float time) { + return fract(sin(dot(uv + fract(time), vec2(12.9898, 78.233))) * 43758.5453); +} + +// pdf: [-0.5;0.5[ +// Removes noise modulation effect by reshaping the uniform/rectangular noise +// distribution (RPDF) into a Triangular (TPDF) or Gaussian Probability Density +// Function (GPDF). +// shape = 1.0: Rectangular +// shape = 0.5: Triangular +// shape < 0.5: Gaussian (0.2~0.4) +float pdf(float noise, float shape) { + float orig = noise * 2.0 - 1.0; + noise = pow(abs(orig), shape); + noise *= sign(orig); + noise -= sign(orig); + return noise * 0.5; +} + void main() { FsrRcasCon(con0, params.FSR_SHARPENING); @@ -62,8 +84,17 @@ void main() { // FSR - [LFGA] LINEAR FILM GRAIN APPLICATOR if (params.FSR_FILMGRAIN > 0.0) { - AF1 noise = fract(10000 * sin(((vTexCoord.x + vTexCoord.y * A_2PI) * params.FrameCount))); - FsrLfgaF(Gamma2Color, AF3_(noise - 0.5), params.FSR_FILMGRAIN); + if (params.FSR_GRAINCOLOR == 0.0) { + float noise = pdf(prng(vTexCoord, params.FrameCount * 0.11), params.FSR_GRAINPDF); + FsrLfgaF(Gamma2Color, vec3(noise), params.FSR_FILMGRAIN); + } else { + vec3 rgbNoise = vec3( + pdf(prng(vTexCoord, params.FrameCount * 0.11), params.FSR_GRAINPDF), + pdf(prng(vTexCoord, params.FrameCount * 0.13), params.FSR_GRAINPDF), + pdf(prng(vTexCoord, params.FrameCount * 0.17), params.FSR_GRAINPDF) + ); + FsrLfgaF(Gamma2Color, rgbNoise, params.FSR_FILMGRAIN); + } } FragColor = vec4(Gamma2Color, 1.0); diff --git a/fsr/smaa+fsr.slangp b/fsr/smaa+fsr.slangp index 6eef148..ab33689 100644 --- a/fsr/smaa+fsr.slangp +++ b/fsr/smaa+fsr.slangp @@ -35,7 +35,14 @@ filter_linear5 = true scale_type5 = source scale5 = 1.0 -parameters = "SMAA_EDT;FSR_SHARPENING;FSR_FILMGRAIN" +parameters = "SMAA_EDT;SMAA_THRESHOLD;SMAA_MAX_SEARCH_STEPS;SMAA_MAX_SEARCH_STEPS_DIAG;SMAA_LOCAL_CONTRAST_ADAPTATION_FACTOR;SMAA_CORNER_ROUNDING;FSR_SHARPENING;FSR_FILMGRAIN;FSR_GRAINCOLOR;FSR_GRAINPDF" SMAA_EDT = 1.0 +SMAA_THRESHOLD = 0.05 +SMAA_MAX_SEARCH_STEPS = 40 +SMAA_MAX_SEARCH_STEPS_DIAG = 20 +SMAA_LOCAL_CONTRAST_ADAPTATION_FACTOR = 2.5 +SMAA_CORNER_ROUNDING = 50.0 FSR_SHARPENING = 0.1 -FSR_FILMGRAIN = 0.12 +FSR_FILMGRAIN = 0.3 +FSR_GRAINCOLOR = 1.0 +FSR_GRAINPDF = 0.3