motion_blur.glslf 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. #version GLSL_VERSION
  2. #include <precision_statement.glslf>
  3. #include <std.glsl>
  4. uniform sampler2D u_mb_tex_curr;
  5. uniform sampler2D u_mb_tex_accum;
  6. uniform float u_motion_blur_exp;
  7. uniform float u_motion_blur_decay_threshold;
  8. // NOTE: texture precision issue (may not occur at low FPS)
  9. // the less the better
  10. float TEX_PRECISION_TRESHOLD = 0.0042;
  11. /*==============================================================================
  12. SHADER INTERFACE
  13. ==============================================================================*/
  14. GLSL_IN vec2 v_texcoord;
  15. //------------------------------------------------------------------------------
  16. GLSL_OUT vec4 GLSL_OUT_FRAG_COLOR;
  17. /*==============================================================================
  18. MAIN
  19. ==============================================================================*/
  20. void main(void) {
  21. vec4 tex_curr = GLSL_TEXTURE(u_mb_tex_curr, v_texcoord);
  22. vec4 tex_accum = GLSL_TEXTURE(u_mb_tex_accum, v_texcoord);
  23. if (length(tex_curr - tex_accum) > u_motion_blur_decay_threshold) {
  24. vec4 blurred_col = (1.0 - u_motion_blur_exp) * tex_curr
  25. + u_motion_blur_exp * tex_accum;
  26. vec4 delta_blur = blurred_col - tex_accum;
  27. vec4 delta_curr = tex_curr - tex_accum;
  28. // NOTE: clamp doesn't fit here, for the "minVal > maxVal" case
  29. vec4 delta = min(max(abs(delta_blur), vec4(TEX_PRECISION_TRESHOLD)),
  30. abs(delta_curr)) * sign(delta_blur);
  31. GLSL_OUT_FRAG_COLOR = tex_accum + delta;
  32. } else {
  33. GLSL_OUT_FRAG_COLOR = tex_curr;
  34. }
  35. }