Ssao.cpp 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. #include <boost/lexical_cast.hpp>
  2. #include "Ssao.h"
  3. #include "Renderer.h"
  4. #include "Scene/Camera.h"
  5. #include "RendererInitializer.h"
  6. #include "Scene/PerspectiveCamera.h"
  7. namespace R {
  8. //==============================================================================
  9. // createFbo =
  10. //==============================================================================
  11. void Ssao::createFbo(Fbo& fbo, Texture& fai)
  12. {
  13. try
  14. {
  15. int width = renderingQuality * r.getWidth();
  16. int height = renderingQuality * r.getHeight();
  17. // create
  18. fbo.create();
  19. fbo.bind();
  20. // inform in what buffers we draw
  21. fbo.setNumOfColorAttachements(1);
  22. // create the texes
  23. Renderer::createFai(width, height, GL_RED, GL_RED, GL_FLOAT, fai);
  24. // attach
  25. glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
  26. GL_TEXTURE_2D, fai.getGlId(), 0);
  27. // test if success
  28. fbo.checkIfGood();
  29. // unbind
  30. fbo.unbind();
  31. }
  32. catch(std::exception& e)
  33. {
  34. throw EXCEPTION("Cannot create deferred shading post-processing "
  35. "stage SSAO blur FBO: " + e.what());
  36. }
  37. }
  38. //==============================================================================
  39. // init =
  40. //==============================================================================
  41. void Ssao::init(const RendererInitializer& initializer)
  42. {
  43. enabled = initializer.pps.ssao.enabled;
  44. if(!enabled)
  45. {
  46. return;
  47. }
  48. renderingQuality = initializer.pps.ssao.renderingQuality;
  49. blurringIterationsNum = initializer.pps.ssao.blurringIterationsNum;
  50. // create FBOs
  51. createFbo(ssaoFbo, ssaoFai);
  52. createFbo(hblurFbo, hblurFai);
  53. createFbo(vblurFbo, fai);
  54. //
  55. // Shaders
  56. //
  57. // first pass prog
  58. ssaoSProg.loadRsrc("shaders/PpsSsao.glsl");
  59. // blurring progs
  60. const char* SHADER_FILENAME = "shaders/GaussianBlurGeneric.glsl";
  61. std::string pps = "#define HPASS\n#define COL_R\n";
  62. hblurSProg.loadRsrc(
  63. ShaderProgram::createSrcCodeToCache(SHADER_FILENAME, pps.c_str()).c_str());
  64. pps = "#define VPASS\n#define COL_R\n";
  65. vblurSProg.loadRsrc(
  66. ShaderProgram::createSrcCodeToCache(SHADER_FILENAME, pps.c_str()).c_str());
  67. //
  68. // noise map
  69. //
  70. noiseMap.loadRsrc("engine-rsrc/noise.png");
  71. noiseMap->setRepeat(true);
  72. }
  73. //==============================================================================
  74. // run =
  75. //==============================================================================
  76. void Ssao::run()
  77. {
  78. if(!enabled)
  79. {
  80. return;
  81. }
  82. int width = renderingQuality * r.getWidth();
  83. int height = renderingQuality * r.getHeight();
  84. const Camera& cam = r.getCamera();
  85. GlStateMachineSingleton::getInstance().enable(GL_BLEND, false);
  86. GlStateMachineSingleton::getInstance().enable(GL_DEPTH_TEST, false);
  87. GlStateMachineSingleton::getInstance().setViewport(0, 0, width, height);
  88. //
  89. // 1st pass
  90. //
  91. ssaoFbo.bind();
  92. ssaoSProg->bind();
  93. // planes
  94. ssaoSProg->getUniformVariableByName("planes").set(&r.getPlanes());
  95. // limitsOfNearPlane
  96. ssaoSProg->getUniformVariableByName("limitsOfNearPlane").set(
  97. &r.getLimitsOfNearPlane());
  98. // limitsOfNearPlane2
  99. ssaoSProg->getUniformVariableByName("limitsOfNearPlane2").set(
  100. &r.getLimitsOfNearPlane2());
  101. // zNear
  102. float zNear = cam.getZNear();
  103. ssaoSProg->getUniformVariableByName("zNear").set(&zNear);
  104. // msDepthFai
  105. ssaoSProg->getUniformVariableByName("msDepthFai").set(r.getMs().getDepthFai(), 0);
  106. // noiseMap
  107. ssaoSProg->getUniformVariableByName("noiseMap").set(*noiseMap, 1);
  108. // noiseMapSize
  109. float noiseMapSize = noiseMap->getWidth();
  110. ssaoSProg->getUniformVariableByName("noiseMapSize").set(&noiseMapSize);
  111. // screenSize
  112. Vec2 screenSize(width * 2, height * 2);
  113. ssaoSProg->getUniformVariableByName("screenSize").set(&screenSize);
  114. // msNormalFai
  115. ssaoSProg->getUniformVariableByName("msNormalFai").set(
  116. r.getMs().getNormalFai(), 2);
  117. r.drawQuad();
  118. //
  119. // Blurring passes
  120. //
  121. hblurFai.setRepeat(false);
  122. fai.setRepeat(false);
  123. for(uint i = 0; i < blurringIterationsNum; i++)
  124. {
  125. // hpass
  126. hblurFbo.bind();
  127. hblurSProg->bind();
  128. if(i == 0)
  129. {
  130. hblurSProg->getUniformVariableByName("img").set(ssaoFai, 0);
  131. }
  132. else
  133. {
  134. hblurSProg->getUniformVariableByName("img").set(fai, 0);
  135. }
  136. float tmp = width;
  137. hblurSProg->getUniformVariableByName("imgDimension").set(&tmp);
  138. r.drawQuad();
  139. // vpass
  140. vblurFbo.bind();
  141. vblurSProg->bind();
  142. vblurSProg->getUniformVariableByName("img").set(hblurFai, 0);
  143. tmp = height;
  144. vblurSProg->getUniformVariableByName("imgDimension").set(&tmp);
  145. r.drawQuad();
  146. }
  147. // end
  148. glBindFramebuffer(GL_FRAMEBUFFER, 0); // Bind the window framebuffer
  149. }
  150. } // end namespace