Bl.cpp 4.8 KB

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