LumixEngine/data/pipelines/film_grain.shd
2020-10-28 21:33:02 +01:00

39 lines
No EOL
1 KiB
Text

include "pipelines/common.glsl"
vertex_shader [[
layout (location = 0) out vec2 v_uv;
void main() {
vec4 pos = fullscreenQuad(gl_VertexID, v_uv);
gl_Position = pos;
}
]]
fragment_shader [[
layout (binding=0) uniform sampler2D u_source;
layout (binding=1) uniform sampler2D u_noise;
layout (location = 0) in vec2 v_uv;
layout (location = 0) out vec4 o_color;
#define timer Global.time.x * 0.01
vec3 filmGrain(vec2 tex_coord, vec2 tex_size, vec3 in_color)
{
const float grainamount = 0.01;
const float lumamount = 0.1;
vec3 noise = texelFetch(u_noise, (ivec2(gl_FragCoord.xy) + ivec2(timer * 1e6)) % ivec2(textureSize(u_noise, 0)), 0).xyz;
float luminance = mix(0.0, luminance(in_color), lumamount);
float lum = smoothstep(0.2, 0.0, luminance) + luminance;
lum += luminance;
noise = mix(vec3(0.0), vec3(pow(lum, 4.0)), noise);
return in_color + noise * grainamount;
}
void main() {
vec3 c = texture(u_source, v_uv).rgb;
vec2 tex_size = textureSize(u_source, 0);
o_color.rgb = filmGrain(v_uv, tex_size, c);
o_color.w = 1;
}
]]