Hdr.cpp 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. /**
  2. * @file
  3. *
  4. * Post-processing stage hight dynamic range lighting pass
  5. */
  6. #include "Renderer.h"
  7. //======================================================================================================================
  8. // initFbos =
  9. //======================================================================================================================
  10. void Renderer::Pps::Hdr::initFbos(Fbo& fbo, Texture& fai, int internalFormat)
  11. {
  12. int width = renderingQuality * r.width;
  13. int height = renderingQuality * r.height;
  14. // create FBO
  15. fbo.create();
  16. fbo.bind();
  17. // inform in what buffers we draw
  18. fbo.setNumOfColorAttachements(1);
  19. // create the texes
  20. fai.createEmpty2D(width, height, internalFormat, GL_RGB, GL_FLOAT, false);
  21. fai.setTexParameter(GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  22. //fai_.setTexParameter(GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  23. fai.setTexParameter(GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  24. // attach
  25. glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, fai.getGlId(), 0);
  26. // test if success
  27. if(!fbo.isGood())
  28. FATAL("Cannot create deferred shading post-processing stage HDR passes FBO");
  29. // unbind
  30. fbo.unbind();
  31. }
  32. //======================================================================================================================
  33. // init =
  34. //======================================================================================================================
  35. void Renderer::Pps::Hdr::init()
  36. {
  37. //int width = renderingQuality * r.width;
  38. int height = renderingQuality * r.height;
  39. initFbos(pass0Fbo, 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. const char* shaderFname = "shaders/PpsHdr.glsl";
  45. string pps;
  46. string prefix;
  47. pps = "#define _PPS_HDR_PASS_0_\n#define IS_FAI_WIDTH " + Util::floatToStr(r.width) + "\n";
  48. prefix = "Pass0IsFaiWidth" + Util::floatToStr(r.width);
  49. pass0SProg.reset(Resource::shaders.load(ShaderProg::createSrcCodeToCache(shaderFname, pps.c_str(),
  50. prefix.c_str()).c_str()));
  51. pass0SProgFaiUniVar = pass0SProg->findUniVar("fai");
  52. pps = "#define _PPS_HDR_PASS_1_\n#define PASS0_HEIGHT " + Util::floatToStr(height) + "\n";
  53. prefix = "Pass1Pass0Height" + Util::floatToStr(height);
  54. pass1SProg.reset(Resource::shaders.load(ShaderProg::createSrcCodeToCache(shaderFname, pps.c_str(),
  55. prefix.c_str()).c_str()));
  56. pass1SProgFaiUniVar = pass1SProg->findUniVar("fai");
  57. pps = "#define _PPS_HDR_PASS_2_\n";
  58. prefix = "Pass2";
  59. pass2SProg.reset(Resource::shaders.load(ShaderProg::createSrcCodeToCache(shaderFname, pps.c_str(),
  60. prefix.c_str()).c_str()));
  61. pass2SProgFaiUniVar = pass2SProg->findUniVar("fai");
  62. }
  63. //======================================================================================================================
  64. // runPass =
  65. //======================================================================================================================
  66. void Renderer::Pps::Hdr::run()
  67. {
  68. int w = renderingQuality * r.width;
  69. int h = renderingQuality * r.height;
  70. Renderer::setViewport(0, 0, w, h);
  71. glDisable(GL_BLEND);
  72. glDisable(GL_DEPTH_TEST);
  73. // pass 0
  74. pass0Fbo.bind();
  75. pass0SProg->bind();
  76. r.is.fai.setRepeat(false);
  77. pass0SProgFaiUniVar->setTexture(r.pps.prePassFai, 0);
  78. Renderer::drawQuad(0);
  79. // pass 1
  80. pass1Fbo.bind();
  81. pass1SProg->bind();
  82. pass0Fai.setRepeat(false);
  83. pass1SProgFaiUniVar->setTexture(pass0Fai, 0);
  84. Renderer::drawQuad(0);
  85. // pass 2
  86. pass2Fbo.bind();
  87. pass2SProg->bind();
  88. pass1Fai.setRepeat(false);
  89. pass2SProgFaiUniVar->setTexture(pass1Fai, 0);
  90. Renderer::drawQuad(0);
  91. // end
  92. Fbo::unbind();
  93. }