Pps.cpp 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. #include "anki/renderer/Pps.h"
  2. #include "anki/renderer/Renderer.h"
  3. #include "anki/renderer/Hdr.h"
  4. #include "anki/renderer/Ssao.h"
  5. #include "anki/renderer/RendererInitializer.h"
  6. namespace anki {
  7. //==============================================================================
  8. // Constructor =
  9. //==============================================================================
  10. Pps::Pps(Renderer& r_)
  11. : RenderingPass(r_),
  12. hdr(r_),
  13. ssao(r_),
  14. bl(r_)
  15. {}
  16. //==============================================================================
  17. // Destructor =
  18. //==============================================================================
  19. Pps::~Pps()
  20. {}
  21. //==============================================================================
  22. // init =
  23. //==============================================================================
  24. void Pps::init(const RendererInitializer& initializer)
  25. {
  26. ssao.init(initializer);
  27. hdr.init(initializer);
  28. //
  29. // Init pre pass
  30. //
  31. // FBO
  32. try
  33. {
  34. prePassFbo.create();
  35. prePassFbo.bind();
  36. prePassFbo.setNumOfColorAttachements(1);
  37. Renderer::createFai(r.getWidth(), r.getHeight(), GL_RGB, GL_RGB,
  38. GL_FLOAT, prePassFai);
  39. glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
  40. GL_TEXTURE_2D, prePassFai.getGlId(), 0);
  41. prePassFbo.checkIfGood();
  42. prePassFbo.unbind();
  43. }
  44. catch(std::exception& e)
  45. {
  46. throw ANKI_EXCEPTION_R("Cannot create pre-pass "
  47. "post-processing stage FBO", e);
  48. }
  49. // SProg
  50. std::string pps = "";
  51. if(ssao.getEnabled())
  52. {
  53. pps += "#define SSAO_ENABLED\n";
  54. }
  55. prePassSProg.load(ShaderProgram::createSrcCodeToCache(
  56. "shaders/PpsPrePass.glsl", pps.c_str()).c_str());
  57. //
  58. // Init post pass
  59. //
  60. // FBO
  61. try
  62. {
  63. postPassFbo.create();
  64. postPassFbo.bind();
  65. postPassFbo.setNumOfColorAttachements(1);
  66. Renderer::createFai(r.getWidth(), r.getHeight(), GL_RGB, GL_RGB,
  67. GL_FLOAT, postPassFai);
  68. glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
  69. GL_TEXTURE_2D, postPassFai.getGlId(), 0);
  70. postPassFbo.checkIfGood();
  71. postPassFbo.unbind();
  72. }
  73. catch(std::exception& e)
  74. {
  75. throw ANKI_EXCEPTION_R("Cannot create post-pass "
  76. "post-processing stage FBO", e);
  77. }
  78. // SProg
  79. pps = "";
  80. if(hdr.getEnabled())
  81. {
  82. pps += "#define HDR_ENABLED\n";
  83. }
  84. postPassSProg.load(ShaderProgram::createSrcCodeToCache(
  85. "shaders/PpsPostPass.glsl", pps.c_str()).c_str());
  86. //
  87. // Init Bl after
  88. //
  89. bl.init(initializer);
  90. }
  91. //==============================================================================
  92. // runPrePass =
  93. //==============================================================================
  94. void Pps::runPrePass()
  95. {
  96. if(ssao.getEnabled())
  97. {
  98. ssao.run();
  99. }
  100. prePassFbo.bind();
  101. GlStateMachineSingleton::get().enable(GL_DEPTH_TEST, false);
  102. GlStateMachineSingleton::get().enable(GL_BLEND, false);
  103. GlStateMachineSingleton::get().setViewport(0, 0,
  104. r.getWidth(), r.getHeight());
  105. prePassSProg->bind();
  106. prePassSProg->getUniformVariableByName("isFai").set(r.getIs().getFai(), 0);
  107. if(ssao.getEnabled())
  108. {
  109. prePassSProg->getUniformVariableByName("ppsSsaoFai").set(
  110. ssao.getFai(), 1);
  111. }
  112. r.drawQuad();
  113. }
  114. //==============================================================================
  115. // runPostPass =
  116. //==============================================================================
  117. void Pps::runPostPass()
  118. {
  119. //
  120. // The actual pass
  121. //
  122. if(hdr.getEnabled())
  123. {
  124. hdr.run();
  125. }
  126. postPassFbo.bind();
  127. GlStateMachineSingleton::get().enable(GL_DEPTH_TEST, false);
  128. GlStateMachineSingleton::get().enable(GL_BLEND, false);
  129. GlStateMachineSingleton::get().setViewport(0, 0,
  130. r.getWidth(), r.getHeight());
  131. postPassSProg->bind();
  132. postPassSProg->getUniformVariableByName("ppsPrePassFai").set(
  133. prePassFai, 0);
  134. if(hdr.getEnabled())
  135. {
  136. postPassSProg->getUniformVariableByName("ppsHdrFai").set(
  137. hdr.getFai(), 1);
  138. }
  139. r.drawQuad();
  140. //
  141. // Blurring
  142. //
  143. bl.run();
  144. }
  145. } // end namespace