#version 460 core #define STAGE_FRAGMENT 1 layout(location = 14) in vec2 f_coords; layout(location = 0) out vec4 out_color; #pragma texture(color_tex, 0, RGB) layout(binding = 0) uniform sampler2D color_tex; #pragma texture(velocity_tex, 1, RG) layout(binding = 1) uniform sampler2D velocity_tex; #pragma texture(depth_tex, 2, R) layout(binding = 2) uniform sampler2D depth_tex; #include "common.glsl" void main() { float ori_depth = texture(depth_tex, f_coords).x; vec2 texelSize = 1.0 / vec2(textureSize(color_tex, 0)); vec2 velocity = texture(velocity_tex, f_coords).xy * param[0].x; float speed = length(velocity / texelSize); int nSamples = clamp(int(speed), 1, 32); float depth_diff = 0.001 * 8.0; vec4 result = vec4(0.0); result += vec4(texture(color_tex, f_coords).rgb, 1.0); for (int i = 1; i < nSamples; ++i) { vec2 offset = velocity * (float(i) / float(nSamples - 1) - 0.5); vec2 coord = f_coords + offset; float depth = texture(depth_tex, coord).x; if (abs(depth - ori_depth) < depth_diff) result += vec4(texture(color_tex, coord).rgb, 1.0); } out_color = vec4((result.rgb / result.w), 1.0); }