Bl.cpp 3.1 KB

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