Hdr.cpp 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. #include <boost/lexical_cast.hpp>
  2. #include "Hdr.h"
  3. #include "Renderer.h"
  4. #include "RendererInitializer.h"
  5. //======================================================================================================================
  6. // initFbos =
  7. //======================================================================================================================
  8. void Hdr::initFbos(Fbo& fbo, Texture& fai, int internalFormat)
  9. {
  10. int width = renderingQuality * r.getWidth();
  11. int height = renderingQuality * r.getHeight();
  12. // create FBO
  13. fbo.create();
  14. fbo.bind();
  15. // inform in what buffers we draw
  16. fbo.setNumOfColorAttachements(1);
  17. // create the texes
  18. fai.createEmpty2D(width, height, internalFormat, GL_RGB, GL_FLOAT);
  19. fai.setTexParameter(GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  20. fai.setTexParameter(GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  21. // attach
  22. glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, fai.getGlId(), 0);
  23. // test if success
  24. if(!fbo.isGood())
  25. FATAL("Cannot create deferred shading post-processing stage HDR passes FBO");
  26. // unbind
  27. fbo.unbind();
  28. }
  29. //======================================================================================================================
  30. // init =
  31. //======================================================================================================================
  32. void Hdr::init(const RendererInitializer& initializer)
  33. {
  34. enabled = initializer.pps.hdr.enabled;
  35. if(!enabled)
  36. return;
  37. renderingQuality = initializer.pps.hdr.renderingQuality;
  38. blurringDist = initializer.pps.hdr.blurringDist;
  39. initFbos(toneFbo, pass0Fai, GL_RGB);
  40. initFbos(pass1Fbo, pass1Fai, GL_RGB);
  41. initFbos(pass2Fbo, fai, GL_RGB);
  42. fai.setTexParameter(GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  43. // init shaders
  44. toneSProg.loadRsrc("shaders/PpsHdr.glsl");
  45. toneProgFaiUniVar = toneSProg->findUniVar("fai");
  46. const char* SHADER_FILENAME = "shaders/GaussianBlurGeneric.glsl";
  47. string pps = "#define HPASS\n#define COL_RGB\n";
  48. string prefix = "HRGB";
  49. pass1SProg.loadRsrc(ShaderProg::createSrcCodeToCache(SHADER_FILENAME, pps.c_str(), prefix.c_str()).c_str());
  50. pass1SProgFaiUniVar = pass1SProg->findUniVar("img");
  51. pps = "#define VPASS\n#define COL_RGB\n";
  52. prefix = "VRGB";
  53. pass2SProg.loadRsrc(ShaderProg::createSrcCodeToCache(SHADER_FILENAME, pps.c_str(), prefix.c_str()).c_str());
  54. pass2SProgFaiUniVar = pass2SProg->findUniVar("img");
  55. }
  56. #include "App.h"
  57. //======================================================================================================================
  58. // runPass =
  59. //======================================================================================================================
  60. void Hdr::run()
  61. {
  62. int w = renderingQuality * r.getWidth();
  63. int h = renderingQuality * r.getHeight();
  64. Renderer::setViewport(0, 0, w, h);
  65. glDisable(GL_BLEND);
  66. glDisable(GL_DEPTH_TEST);
  67. // pass 0
  68. toneFbo.bind();
  69. toneSProg->bind();
  70. r.is.fai.setRepeat(false);
  71. toneProgFaiUniVar->setTexture(r.pps.prePassFai, 0);
  72. Renderer::drawQuad(0);
  73. Vec2 imgSize(w, h);
  74. for(uint i=0; i<2; i++)
  75. {
  76. // hpass
  77. pass1Fbo.bind();
  78. pass1SProg->bind();
  79. if(i == 0)
  80. {
  81. pass1SProgFaiUniVar->setTexture(pass0Fai, 0);
  82. }
  83. else
  84. {
  85. pass1SProgFaiUniVar->setTexture(fai, 0);
  86. }
  87. pass1SProg->findUniVar("imgSize")->setVec2(&imgSize);
  88. pass1SProg->findUniVar("blurringDist")->setFloat(blurringDist);
  89. Renderer::drawQuad(0);
  90. // vpass
  91. pass2Fbo.bind();
  92. pass2SProg->bind();
  93. pass2SProgFaiUniVar->setTexture(pass1Fai, 0);
  94. pass2SProg->findUniVar("imgSize")->setVec2(&imgSize);
  95. pass2SProg->findUniVar("blurringDist")->setFloat(blurringDist);
  96. Renderer::drawQuad(0);
  97. }
  98. // end
  99. Fbo::unbind();
  100. }