Pps.cpp 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  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. namespace anki {
  6. //==============================================================================
  7. Pps::Pps(Renderer* r_)
  8. : RenderingPass(r_), hdr(r_), ssao(r_), bl(r_)
  9. {}
  10. //==============================================================================
  11. Pps::~Pps()
  12. {}
  13. //==============================================================================
  14. void Pps::initInternal(const RendererInitializer& initializer)
  15. {
  16. ssao.init(initializer);
  17. hdr.init(initializer);
  18. drawFinalToDefaultFbo = initializer.pps.drawFinalToDefaultFbo;
  19. // FBO
  20. if(!drawFinalToDefaultFbo)
  21. {
  22. Renderer::createFai(r->getWidth(), r->getHeight(), GL_RGB, GL_RGB,
  23. GL_FLOAT, fai);
  24. fbo.create();
  25. fbo.setColorAttachments({&fai});
  26. if(!fbo.isComplete())
  27. {
  28. throw ANKI_EXCEPTION("Fbo not complete");
  29. }
  30. }
  31. // SProg
  32. std::string pps = "";
  33. if(ssao.getEnabled())
  34. {
  35. pps += "#define SSAO_ENABLED\n";
  36. }
  37. if(hdr.getEnabled())
  38. {
  39. pps += "#define HDR_ENABLED\n";
  40. }
  41. prog.load(ShaderProgramResource::createSrcCodeToCache(
  42. "shaders/Pps.glsl", pps.c_str()).c_str());
  43. }
  44. //==============================================================================
  45. void Pps::init(const Renderer::Initializer& initializer)
  46. {
  47. try
  48. {
  49. initInternal(initializer);
  50. }
  51. catch(const std::exception& e)
  52. {
  53. throw ANKI_EXCEPTION("Failed to init PPS") << e;
  54. }
  55. }
  56. //==============================================================================
  57. void Pps::run()
  58. {
  59. // First SSAO because it depends on MS where HDR depends on IS
  60. if(ssao.getEnabled())
  61. {
  62. ssao.run();
  63. }
  64. if(hdr.getEnabled())
  65. {
  66. hdr.run();
  67. }
  68. if(drawFinalToDefaultFbo)
  69. {
  70. Fbo::unbindAll();
  71. }
  72. else
  73. {
  74. fbo.bind();
  75. }
  76. GlStateSingleton::get().enable(GL_DEPTH_TEST, false);
  77. GlStateSingleton::get().enable(GL_BLEND, false);
  78. GlStateSingleton::get().setViewport(0, 0,
  79. r->getWidth(), r->getHeight());
  80. prog->bind();
  81. prog->findUniformVariable("isFai").set(r->getIs().getFai());
  82. if(ssao.getEnabled())
  83. {
  84. prog->findUniformVariable("ppsSsaoFai").set(ssao.getFai());
  85. }
  86. if(hdr.getEnabled())
  87. {
  88. prog->findUniformVariable("ppsHdrFai").set(hdr.getFai());
  89. }
  90. //prog->findUniformVariable("msDepthFai").set(r->getMs().getDepthFai());
  91. r->drawQuad();
  92. }
  93. } // end namespace anki