Bl.cpp 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. #include "anki/renderer/Bl.h"
  2. #include "anki/renderer/RendererInitializer.h"
  3. #include "anki/renderer/Renderer.h"
  4. #include "anki/resource/ShaderProgram.h"
  5. namespace anki {
  6. //==============================================================================
  7. Bl::Bl(Renderer& r_)
  8. : SwitchableRenderingPass(r_)
  9. {}
  10. //==============================================================================
  11. void Bl::init(const RendererInitializer& initializer)
  12. {
  13. enabled = initializer.pps.bl.enabled;
  14. blurringIterationsNum = initializer.pps.bl.blurringIterationsNum;
  15. sideBlurFactor = initializer.pps.bl.sideBlurFactor;
  16. if(!enabled)
  17. {
  18. return;
  19. }
  20. // Horizontal
  21. try
  22. {
  23. Renderer::createFai(r.getWidth(), r.getHeight(), GL_RGB, GL_RGB,
  24. GL_FLOAT, blurFai);
  25. hBlurFbo.create();
  26. hBlurFbo.bind();
  27. hBlurFbo.setNumOfColorAttachements(1);
  28. glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
  29. GL_TEXTURE_2D, blurFai.getGlId(), 0);
  30. }
  31. catch(const std::exception& e)
  32. {
  33. throw ANKI_EXCEPTION("Cannot create horizontal blur "
  34. "post-processing stage FBO") << e;
  35. }
  36. hBlurSProg.load(ShaderProgram::createSrcCodeToCache(
  37. "shaders/PpsBlurGeneric.glsl", "#define HPASS\n").c_str());
  38. // Vertical
  39. try
  40. {
  41. vBlurFbo.create();
  42. vBlurFbo.bind();
  43. vBlurFbo.setNumOfColorAttachements(1);
  44. glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
  45. GL_TEXTURE_2D, r.getPps().getPostPassFai().getGlId(), 0);
  46. }
  47. catch(std::exception& e)
  48. {
  49. throw ANKI_EXCEPTION("Cannot create vertical blur "
  50. "post-processing stage FBO") << e;
  51. }
  52. vBlurSProg.load(ShaderProgram::createSrcCodeToCache(
  53. "shaders/PpsBlurGeneric.glsl", "#define VPASS\n").c_str());
  54. // Side blur
  55. try
  56. {
  57. sideBlurFbo.create();
  58. sideBlurFbo.bind();
  59. sideBlurFbo.setNumOfColorAttachements(1);
  60. glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
  61. GL_TEXTURE_2D, r.getMs().getNormalFai().getGlId(), 0);
  62. }
  63. catch(std::exception& e)
  64. {
  65. throw ANKI_EXCEPTION("Cannot create side blur "
  66. "post-processing stage FBO") << e;
  67. }
  68. sideBlurMap.load("engine-rsrc/side-blur.png");
  69. sideBlurSProg.load("shaders/PpsSideBlur.glsl");
  70. }
  71. //==============================================================================
  72. void Bl::runSideBlur()
  73. {
  74. if(sideBlurFactor == 0.0)
  75. {
  76. return;
  77. }
  78. sideBlurFbo.bind();
  79. GlStateMachineSingleton::get().enable(GL_BLEND);
  80. glBlendFunc(GL_ONE, GL_ONE);
  81. sideBlurSProg->bind();
  82. sideBlurSProg->findUniformVariableByName("tex").set(*sideBlurMap, 0);
  83. sideBlurSProg->findUniformVariableByName("factor").set(sideBlurFactor);
  84. r.drawQuad();
  85. }
  86. //==============================================================================
  87. void Bl::runBlur()
  88. {
  89. GlStateMachineSingleton::get().disable(GL_BLEND);
  90. for(uint i = 0; i < blurringIterationsNum; i++)
  91. {
  92. // hpass
  93. hBlurFbo.bind();
  94. hBlurSProg->bind();
  95. hBlurSProg->findUniformVariableByName("img").set(
  96. r.getPps().getPostPassFai(), 0);
  97. hBlurSProg->findUniformVariableByName("msNormalFai").set(
  98. r.getMs().getNormalFai(), 1);
  99. float tmp = r.getWidth();
  100. hBlurSProg->findUniformVariableByName("imgDimension").set(tmp);
  101. r.drawQuad();
  102. // vpass
  103. vBlurFbo.bind();
  104. vBlurSProg->bind();
  105. vBlurSProg->findUniformVariableByName("img").set(blurFai, 0);
  106. vBlurSProg->findUniformVariableByName("msNormalFai").set(
  107. r.getMs().getNormalFai(), 1);
  108. tmp = r.getHeight();
  109. vBlurSProg->findUniformVariableByName("imgDimension").set(tmp);
  110. r.drawQuad();
  111. }
  112. }
  113. //==============================================================================
  114. void Bl::run()
  115. {
  116. if(!enabled)
  117. {
  118. return;
  119. }
  120. runSideBlur();
  121. runBlur();
  122. }
  123. } // end namespace