Hdr.cpp 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. #include <boost/lexical_cast.hpp>
  2. #include "anki/renderer/Hdr.h"
  3. #include "anki/renderer/Renderer.h"
  4. #include "anki/renderer/RendererInitializer.h"
  5. namespace anki {
  6. //==============================================================================
  7. // Constructor =
  8. //==============================================================================
  9. Hdr::Hdr(Renderer& r_)
  10. : SwitchableRenderingPass(r_)
  11. {}
  12. //==============================================================================
  13. // Destructor =
  14. //==============================================================================
  15. Hdr::~Hdr()
  16. {}
  17. //==============================================================================
  18. // initFbo =
  19. //==============================================================================
  20. void Hdr::initFbo(Fbo& fbo, Texture& fai)
  21. {
  22. try
  23. {
  24. int width = renderingQuality * r.getWidth();
  25. int height = renderingQuality * r.getHeight();
  26. // create FBO
  27. fbo.create();
  28. fbo.bind();
  29. // inform in what buffers we draw
  30. fbo.setNumOfColorAttachements(1);
  31. // create the FAI
  32. Renderer::createFai(width, height, GL_RGB, GL_RGB, GL_FLOAT, fai);
  33. // attach
  34. glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
  35. GL_TEXTURE_2D, fai.getGlId(), 0);
  36. // test if success
  37. fbo.checkIfGood();
  38. // unbind
  39. fbo.unbind();
  40. }
  41. catch(std::exception& e)
  42. {
  43. throw ANKI_EXCEPTION("Cannot create deferred shading "
  44. "post-processing stage HDR passes FBO") << e;
  45. }
  46. }
  47. //==============================================================================
  48. // init =
  49. //==============================================================================
  50. void Hdr::init(const RendererInitializer& initializer)
  51. {
  52. enabled = initializer.pps.hdr.enabled;
  53. if(!enabled)
  54. {
  55. return;
  56. }
  57. renderingQuality = initializer.pps.hdr.renderingQuality;
  58. blurringDist = initializer.pps.hdr.blurringDist;
  59. blurringIterationsNum = initializer.pps.hdr.blurringIterationsNum;
  60. exposure = initializer.pps.hdr.exposure;
  61. initFbo(toneFbo, toneFai);
  62. initFbo(hblurFbo, hblurFai);
  63. initFbo(vblurFbo, fai);
  64. fai.setFiltering(Texture::TFT_LINEAR);
  65. // init shaders
  66. toneSProg.load("shaders/PpsHdr.glsl");
  67. const char* SHADER_FILENAME = "shaders/GaussianBlurGeneric.glsl";
  68. std::string pps = "#define HPASS\n#define COL_RGB\n";
  69. hblurSProg.load(ShaderProgram::createSrcCodeToCache(SHADER_FILENAME,
  70. pps.c_str()).c_str());
  71. pps = "#define VPASS\n#define COL_RGB\n";
  72. vblurSProg.load(ShaderProgram::createSrcCodeToCache(SHADER_FILENAME,
  73. pps.c_str()).c_str());
  74. }
  75. //==============================================================================
  76. // runPass =
  77. //==============================================================================
  78. void Hdr::run()
  79. {
  80. /*if(r.getFramesNum() % 2 == 0)
  81. {
  82. return;
  83. }*/
  84. int w = renderingQuality * r.getWidth();
  85. int h = renderingQuality * r.getHeight();
  86. GlStateMachineSingleton::get().setViewport(0, 0, w, h);
  87. GlStateMachineSingleton::get().enable(GL_BLEND, false);
  88. GlStateMachineSingleton::get().enable(GL_DEPTH_TEST, false);
  89. // pass 0
  90. toneFbo.bind();
  91. toneSProg->bind();
  92. toneSProg->getUniformVariableByName("exposure").set(&exposure);
  93. toneSProg->getUniformVariableByName("fai").set(
  94. r.getPps().getPrePassFai(), 0);
  95. r.drawQuad();
  96. // blurring passes
  97. hblurFai.setRepeat(false);
  98. fai.setRepeat(false);
  99. for(uint i=0; i<blurringIterationsNum; i++)
  100. {
  101. // hpass
  102. hblurFbo.bind();
  103. hblurSProg->bind();
  104. if(i == 0)
  105. {
  106. hblurSProg->getUniformVariableByName("img").set(toneFai, 0);
  107. }
  108. else
  109. {
  110. hblurSProg->getUniformVariableByName("img").set(fai, 0);
  111. }
  112. float tmp = float(w);
  113. hblurSProg->getUniformVariableByName("imgDimension").set(&tmp);
  114. tmp = blurringDist / w;
  115. hblurSProg->getUniformVariableByName("blurringDist").set(&tmp);
  116. r.drawQuad();
  117. // vpass
  118. vblurFbo.bind();
  119. vblurSProg->bind();
  120. vblurSProg->getUniformVariableByName("img").set(hblurFai, 0);
  121. tmp = float(h);
  122. vblurSProg->getUniformVariableByName("imgDimension").set(&tmp);
  123. tmp = blurringDist / h;
  124. vblurSProg->getUniformVariableByName("blurringDist").set(&tmp);
  125. r.drawQuad();
  126. }
  127. // end
  128. glBindFramebuffer(GL_FRAMEBUFFER, 0); // Bind the window framebuffer
  129. }
  130. } // end namespace