LumixEngine/data/pipelines/film_grain.shd
2021-10-09 22:49:03 +02:00

39 lines
No EOL
1.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;
layout(std140, binding = 4) uniform Drawcall {
float u_grainamount;
float u_lumamount;
};
vec3 filmGrain(vec2 tex_coord, vec2 tex_size, vec3 in_color)
{
vec3 noise = texelFetch(u_noise, (ivec2(gl_FragCoord.xy) + ivec2(Global.time * 1e4)) % ivec2(textureSize(u_noise, 0)), 0).xyz;
float luminance = mix(0.0, luminance(in_color), u_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 * u_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;
}
]]