Bl.cpp 4.3 KB

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