bloom.glsl 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. //@renderpasses 0,1,2,3
  2. uniform sampler2D r_SourceBuffer;
  3. uniform vec2 r_SourceBufferSize;
  4. uniform vec2 r_SourceBufferScale;
  5. varying vec2 v_TexCoord0;
  6. //@vertex
  7. attribute vec2 a_Position; //0...1 (1=viewport size)
  8. void main(){
  9. v_TexCoord0=a_Position * r_SourceBufferScale;
  10. gl_Position=vec4( a_Position * 2.0 - 1.0,-1.0,1.0 );
  11. }
  12. //@fragment
  13. const float weight0=0.227027,weight1=0.1945946,weight2=0.1216216,weight3=0.054054,weight4=0.016216;
  14. //apparently the same if linear filter enabled in texture...
  15. //const float weight0=0.2270270270,weight1=0.3162162162,weight2=0.0702702703;
  16. void main(){
  17. #if MX2_RENDERPASS==3
  18. vec3 result=texture2D( r_SourceBuffer,v_TexCoord0 ).rgb;
  19. #else
  20. vec2 texel_size=1.0/r_SourceBufferSize;
  21. vec3 result=texture2D( r_SourceBuffer,v_TexCoord0 ).rgb*weight0;
  22. #if MX2_RENDERPASS==0 || MX2_RENDERPASS==2
  23. result+=texture2D(r_SourceBuffer,v_TexCoord0+vec2(texel_size.x*1.0,0.0)).rgb * weight1;
  24. result+=texture2D(r_SourceBuffer,v_TexCoord0-vec2(texel_size.x*1.0,0.0)).rgb * weight1;
  25. result+=texture2D(r_SourceBuffer,v_TexCoord0+vec2(texel_size.x*2.0,0.0)).rgb * weight2;
  26. result+=texture2D(r_SourceBuffer,v_TexCoord0-vec2(texel_size.x*2.0,0.0)).rgb * weight2;
  27. result+=texture2D(r_SourceBuffer,v_TexCoord0+vec2(texel_size.x*3.0,0.0)).rgb * weight3;
  28. result+=texture2D(r_SourceBuffer,v_TexCoord0-vec2(texel_size.x*3.0,0.0)).rgb * weight3;
  29. result+=texture2D(r_SourceBuffer,v_TexCoord0+vec2(texel_size.x*4.0,0.0)).rgb * weight4;
  30. result+=texture2D(r_SourceBuffer,v_TexCoord0-vec2(texel_size.x*4.0,0.0)).rgb * weight4;
  31. #elif MX2_RENDERPASS==1
  32. result+=texture2D(r_SourceBuffer,v_TexCoord0+vec2(0.0,texel_size.y*1.0)).rgb * weight1;
  33. result+=texture2D(r_SourceBuffer,v_TexCoord0-vec2(0.0,texel_size.y*1.0)).rgb * weight1;
  34. result+=texture2D(r_SourceBuffer,v_TexCoord0+vec2(0.0,texel_size.y*2.0)).rgb * weight2;
  35. result+=texture2D(r_SourceBuffer,v_TexCoord0-vec2(0.0,texel_size.y*2.0)).rgb * weight2;
  36. result+=texture2D(r_SourceBuffer,v_TexCoord0+vec2(0.0,texel_size.y*3.0)).rgb * weight3;
  37. result+=texture2D(r_SourceBuffer,v_TexCoord0-vec2(0.0,texel_size.y*3.0)).rgb * weight3;
  38. result+=texture2D(r_SourceBuffer,v_TexCoord0+vec2(0.0,texel_size.y*4.0)).rgb * weight4;
  39. result+=texture2D(r_SourceBuffer,v_TexCoord0-vec2(0.0,texel_size.y*4.0)).rgb * weight4;
  40. #endif
  41. #if MX2_RENDERPASS==0
  42. result=max( result-1.0,0.0 );
  43. #endif
  44. #endif
  45. gl_FragColor=vec4( result,1.0 );
  46. }