80 lines
1.8 KiB
GLSL
80 lines
1.8 KiB
GLSL
#version 450
|
|
#pragma shader_stage(fragment)
|
|
#extension GL_EXT_samplerless_texture_functions : require
|
|
|
|
layout (location = 0) in vec2 inUv;
|
|
layout (location = 1) flat in uint inPass;
|
|
|
|
layout (location = 0) out vec4 outColor;
|
|
|
|
layout (binding = 0) uniform sampler2D samplerColor;
|
|
|
|
layout (binding = 1) uniform UBO {
|
|
float curTime;
|
|
float gamma;
|
|
float exposure;
|
|
uint padding;
|
|
} ubo;
|
|
|
|
#define TONE_MAP 1
|
|
#define GAMMA_CORRECT 1
|
|
#define TEXTURES 1
|
|
|
|
#include "../../common/macros.h"
|
|
#include "../../common/structs.h"
|
|
#include "../../common/functions.h"
|
|
|
|
vec2 barrelDistortion(vec2 coord, float amt) {
|
|
vec2 cc = coord - 0.5;
|
|
float dist = dot(cc, cc);
|
|
return coord + cc * dist * amt;
|
|
}
|
|
|
|
float sat( float t ) {
|
|
return clamp( t, 0.0, 1.0 );
|
|
}
|
|
|
|
float linterp( float t ) {
|
|
return sat( 1.0 - abs( 2.0*t - 1.0 ) );
|
|
}
|
|
|
|
float remap( float t, float a, float b ) {
|
|
return sat( (t - a) / (b - a) );
|
|
}
|
|
|
|
vec4 spectrumOffset( float t ) {
|
|
vec4 ret;
|
|
float lo = step(t,0.5);
|
|
float hi = 1.0-lo;
|
|
float w = linterp( remap( t, 1.0/6.0, 5.0/6.0 ) );
|
|
ret = vec4(lo,1.0,hi, 1.) * vec4(1.0-w, w, 1.0-w, 1.);
|
|
|
|
return pow( ret, vec4(1.0/2.2) );
|
|
}
|
|
|
|
const float MAX_DISTORT = 0.125;
|
|
const int ITERATIONS = 32;
|
|
const float ITERATIONS_RECIP = 1.0 / float(ITERATIONS);
|
|
|
|
void main() {
|
|
const vec2 screenResolution = textureSize( samplerColor, 0 );
|
|
const vec2 uv = (inUv.xy); // * 2.0 - 1.0);
|
|
|
|
vec4 colorSigma = vec4(0.0);
|
|
vec4 wSigma = vec4(0.0);
|
|
for ( uint i=0; i < ITERATIONS;++i ) {
|
|
float t = float(i) * ITERATIONS_RECIP;
|
|
vec4 w = spectrumOffset( t );
|
|
wSigma += w;
|
|
colorSigma += w * texture(samplerColor, barrelDistortion(uv, MAX_DISTORT * t * 0.6 ));
|
|
}
|
|
|
|
outColor = colorSigma / wSigma;
|
|
|
|
#if TONE_MAP
|
|
toneMap(outColor, ubo.exposure);
|
|
#endif
|
|
#if GAMMA_CORRECT
|
|
gammaCorrect(outColor, ubo.gamma);
|
|
#endif
|
|
} |