2
0

Pps.cpp 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. #include "Pps.h"
  2. #include "Renderer.h"
  3. #include "Hdr.h"
  4. #include "Ssao.h"
  5. //======================================================================================================================
  6. // Constructor =
  7. //======================================================================================================================
  8. Pps::Pps(Renderer& r_):
  9. RenderingPass(r_),
  10. hdr(r_),
  11. ssao(r_)
  12. {}
  13. //======================================================================================================================
  14. // initPassFbo =
  15. //======================================================================================================================
  16. void Pps::initPassFbo(Fbo& fbo, Texture& fai)
  17. {
  18. fbo.create();
  19. fbo.bind();
  20. fbo.setNumOfColorAttachements(1);
  21. fai.createEmpty2D(r.getWidth(), r.getHeight(), GL_RGB, GL_RGB, GL_FLOAT);
  22. fai.setRepeat(false);
  23. glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, fai.getGlId(), 0);
  24. fbo.checkIfGood();
  25. fbo.unbind();
  26. }
  27. //======================================================================================================================
  28. // initPrePassSProg =
  29. //======================================================================================================================
  30. void Pps::initPrePassSProg()
  31. {
  32. std::string pps = "";
  33. std::string prefix = "";
  34. if(ssao.isEnabled())
  35. {
  36. pps += "#define SSAO_ENABLED\n";
  37. prefix += "Ssao";
  38. }
  39. prePassSProg.loadRsrc(ShaderProg::createSrcCodeToCache("shaders/PpsPrePass.glsl", pps.c_str(),
  40. prefix.c_str()).c_str());
  41. prePassSProg->bind();
  42. }
  43. //======================================================================================================================
  44. // initPostPassSProg =
  45. //======================================================================================================================
  46. void Pps::initPostPassSProg()
  47. {
  48. std::string pps = "";
  49. std::string prefix = "";
  50. if(hdr.isEnabled())
  51. {
  52. pps += "#define HDR_ENABLED\n";
  53. prefix += "Hdr";
  54. }
  55. postPassSProg.loadRsrc(ShaderProg::createSrcCodeToCache("shaders/PpsPostPass.glsl", pps.c_str(),
  56. prefix.c_str()).c_str());
  57. postPassSProg->bind();
  58. }
  59. //======================================================================================================================
  60. // init =
  61. //======================================================================================================================
  62. void Pps::init(const RendererInitializer& initializer)
  63. {
  64. ssao.init(initializer);
  65. hdr.init(initializer);
  66. try
  67. {
  68. initPassFbo(prePassFbo, prePassFai);
  69. }
  70. catch(std::exception& e)
  71. {
  72. throw EXCEPTION("Cannot create pre-pass post-processing stage FBO: " + e.what());
  73. }
  74. try
  75. {
  76. initPassFbo(postPassFbo, postPassFai);
  77. }
  78. catch(std::exception& e)
  79. {
  80. throw EXCEPTION("Cannot create post-pass post-processing stage FBO: " + e.what());
  81. }
  82. initPrePassSProg();
  83. initPostPassSProg();
  84. }
  85. //======================================================================================================================
  86. // runPrePass =
  87. //======================================================================================================================
  88. void Pps::runPrePass()
  89. {
  90. if(ssao.isEnabled())
  91. {
  92. ssao.run();
  93. }
  94. prePassFbo.bind();
  95. glDisable(GL_DEPTH_TEST);
  96. glDisable(GL_BLEND);
  97. Renderer::setViewport(0, 0, r.getWidth(), r.getHeight());
  98. prePassSProg->bind();
  99. prePassSProg->findUniVar("isFai")->set(r.getIs().getFai(), 0);
  100. if(ssao.isEnabled())
  101. {
  102. prePassSProg->findUniVar("ppsSsaoFai")->set(ssao.getFai(), 1);
  103. }
  104. r.drawQuad();
  105. Fbo::unbind();
  106. }
  107. //======================================================================================================================
  108. // runPostPass =
  109. //======================================================================================================================
  110. void Pps::runPostPass()
  111. {
  112. if(hdr.isEnabled())
  113. {
  114. hdr.run();
  115. }
  116. postPassFbo.bind();
  117. glDisable(GL_DEPTH_TEST);
  118. glDisable(GL_BLEND);
  119. Renderer::setViewport(0, 0, r.getWidth(), r.getHeight());
  120. postPassSProg->bind();
  121. postPassSProg->findUniVar("ppsPrePassFai")->set(prePassFai, 0);
  122. if(hdr.isEnabled())
  123. {
  124. postPassSProg->findUniVar("ppsHdrFai")->set(hdr.getFai(), 1);
  125. }
  126. r.drawQuad();
  127. Fbo::unbind();
  128. }