bloomeffect.monkey2 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. Namespace mojo3d
  2. #rem The BloomEffect class.
  3. This class implements a 'bloom' post processing effect.
  4. #end
  5. Class BloomEffect Extends PostEffect
  6. #rem monkeydoc Creates a new bloom effect.
  7. #end
  8. Method New( passes:Int=2 )
  9. _shader=Shader.Open( "effects/bloom" )
  10. _uniforms=New UniformBlock( 3 )
  11. Passes=passes
  12. End
  13. #rem monkeydoc The number of passes.
  14. Must be an even number greater than 0.
  15. #end
  16. Property Passes:Int()
  17. Return _passes
  18. Setter( passes:Int )
  19. Assert( passes>0 And (passes&1)=0,"BloomEffect passes must be even and >0" )
  20. _passes=passes
  21. End
  22. Protected
  23. Method OnRender( target:RenderTarget,viewport:Recti ) Override
  24. Local size:=viewport.Size
  25. Local source:=target.GetColorTexture( 0 )
  26. If Not _target0 Or size.x>_target0.Size.x Or size.y>_target0.Size.y
  27. _target0=CreateRenderTarget( size,source.Format,TextureFlags.Dynamic )
  28. _target1=CreateRenderTarget( size,source.Format,TextureFlags.Dynamic )
  29. Endif
  30. Device.Shader=_shader
  31. Device.BindUniformBlock( _uniforms )
  32. Local rtarget:=_target0
  33. For Local i:=0 Until _passes
  34. Super.SetRenderTarget( rtarget,New Recti( 0,0,size ) )
  35. Device.RenderPass=i ? 2-(i&1) Else 0 '0,1,2,1,2,1,2...
  36. RenderQuad()
  37. rtarget=rtarget=_target0 ? _target1 Else _target0
  38. Next
  39. Super.SetRenderTarget( target,viewport )
  40. Device.BlendMode=BlendMode.Additive
  41. Device.RenderPass=3
  42. RenderQuad()
  43. End
  44. Private
  45. Field _shader:Shader
  46. Field _uniforms:UniformBlock
  47. Field _passes:Int=4
  48. Field _target0:RenderTarget
  49. Field _target1:RenderTarget
  50. End