Bl.cpp 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. #include "Bl.h"
  2. #include "RendererInitializer.h"
  3. #include "Renderer.h"
  4. #include "Resources/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").c_str());
  37. // Vertical
  38. try
  39. {
  40. vBlurFbo.create();
  41. vBlurFbo.bind();
  42. vBlurFbo.setNumOfColorAttachements(1);
  43. glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
  44. r.getPps().getPostPassFai().getGlId(), 0);
  45. }
  46. catch(std::exception& e)
  47. {
  48. throw EXCEPTION("Cannot create vertical blur post-processing stage FBO: " + e.what());
  49. }
  50. vBlurSProg.loadRsrc(ShaderProg::createSrcCodeToCache("shaders/PpsBlurGeneric.glsl", "#define VPASS\n").c_str());
  51. // Side blur
  52. try
  53. {
  54. sideBlurFbo.create();
  55. sideBlurFbo.bind();
  56. sideBlurFbo.setNumOfColorAttachements(1);
  57. glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
  58. r.getMs().getNormalFai().getGlId(), 0);
  59. }
  60. catch(std::exception& e)
  61. {
  62. throw EXCEPTION("Cannot create side blur post-processing stage FBO: " + e.what());
  63. }
  64. sideBlurMap.loadRsrc("engine-rsrc/side-blur.png");
  65. sideBlurSProg.loadRsrc("shaders/PpsSideBlur.glsl");
  66. }
  67. //==============================================================================
  68. // runSideBlur =
  69. //==============================================================================
  70. void Bl::runSideBlur()
  71. {
  72. if(sideBlurFactor == 0.0)
  73. {
  74. return;
  75. }
  76. sideBlurFbo.bind();
  77. GlStateMachineSingleton::getInstance().enable(GL_BLEND);
  78. glBlendFunc(GL_ONE, GL_ONE);
  79. sideBlurSProg->bind();
  80. sideBlurSProg->findUniVar("tex")->set(*sideBlurMap, 0);
  81. sideBlurSProg->findUniVar("factor")->set(&sideBlurFactor);
  82. r.drawQuad();
  83. }
  84. //==============================================================================
  85. // runBlur =
  86. //==============================================================================
  87. void Bl::runBlur()
  88. {
  89. GlStateMachineSingleton::getInstance().disable(GL_BLEND);
  90. for(uint i = 0; i < blurringIterationsNum; i++)
  91. {
  92. // hpass
  93. hBlurFbo.bind();
  94. hBlurSProg->bind();
  95. hBlurSProg->findUniVar("img")->set(r.getPps().getPostPassFai(), 0);
  96. hBlurSProg->findUniVar("msNormalFai")->set(r.getMs().getNormalFai(), 1);
  97. float tmp = r.getWidth();
  98. hBlurSProg->findUniVar("imgDimension")->set(&tmp);
  99. r.drawQuad();
  100. // vpass
  101. vBlurFbo.bind();
  102. vBlurSProg->bind();
  103. vBlurSProg->findUniVar("img")->set(blurFai, 0);
  104. vBlurSProg->findUniVar("msNormalFai")->set(r.getMs().getNormalFai(), 1);
  105. tmp = r.getHeight();
  106. vBlurSProg->findUniVar("imgDimension")->set(&tmp);
  107. r.drawQuad();
  108. }
  109. }
  110. //==============================================================================
  111. // run =
  112. //==============================================================================
  113. void Bl::run()
  114. {
  115. if(!enabled)
  116. {
  117. return;
  118. }
  119. runSideBlur();
  120. runBlur();
  121. }