39 lines
No EOL
1 KiB
Text
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;
|
|
}
|
|
]] |