Ms.cpp 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. #include "anki/renderer/Ms.h"
  2. #include "anki/renderer/Ez.h"
  3. #include "anki/renderer/Renderer.h"
  4. #include "anki/core/Logger.h"
  5. #include "anki/scene/Camera.h"
  6. #include "anki/scene/SceneGraph.h"
  7. namespace anki {
  8. //==============================================================================
  9. Ms::~Ms()
  10. {}
  11. //==============================================================================
  12. void Ms::init(const RendererInitializer& initializer)
  13. {
  14. try
  15. {
  16. #if ANKI_RENDERER_USE_MRT
  17. fai0.create2dFai(r->getWidth(), r->getHeight(), GL_RGBA8,
  18. GL_RGBA, GL_UNSIGNED_BYTE);
  19. fai1.create2dFai(r->getWidth(), r->getHeight(), GL_RG16F,
  20. GL_RG, GL_FLOAT);
  21. #else
  22. fai0.create2dFai(r->getWidth(), r->getHeight(), GL_RG32UI,
  23. GL_RG_INTEGER, GL_UNSIGNED_INT);
  24. #endif
  25. depthFai.create2dFai(r->getWidth(), r->getHeight(),
  26. GL_DEPTH24_STENCIL8, GL_DEPTH_STENCIL,
  27. GL_UNSIGNED_INT_24_8);
  28. fbo.create();
  29. #if ANKI_RENDERER_USE_MRT
  30. fbo.setColorAttachments({&fai0, &fai1});
  31. #else
  32. fbo.setColorAttachments({&fai0});
  33. #endif
  34. fbo.setOtherAttachment(GL_DEPTH_STENCIL_ATTACHMENT, depthFai);
  35. if(!fbo.isComplete())
  36. {
  37. throw ANKI_EXCEPTION("FBO is incomplete");
  38. }
  39. }
  40. catch(std::exception& e)
  41. {
  42. throw ANKI_EXCEPTION("Cannot create deferred "
  43. "shading material stage") << e;
  44. }
  45. ez.init(initializer);
  46. }
  47. //==============================================================================
  48. void Ms::run()
  49. {
  50. GlState& gl = GlStateSingleton::get();
  51. fbo.bind();
  52. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
  53. gl.setViewport(0, 0, r->getWidth(), r->getHeight());
  54. gl.disable(GL_BLEND);
  55. gl.enable(GL_DEPTH_TEST);
  56. gl.setDepthFunc(GL_LESS);
  57. gl.setDepthMaskEnabled(true);
  58. if(ez.getEnabled())
  59. {
  60. glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
  61. ez.run();
  62. gl.setDepthFunc(GL_LEQUAL);
  63. glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
  64. //gl.setDepthMaskEnabled(false);
  65. }
  66. // render all
  67. r->getSceneDrawer().prepareDraw();
  68. VisibilityTestResults& vi =
  69. *r->getSceneGraph().getActiveCamera().getVisibilityTestResults();
  70. for(auto it = vi.getRenderablesBegin(); it != vi.getRenderablesEnd(); ++it)
  71. {
  72. r->getSceneDrawer().render(r->getSceneGraph().getActiveCamera(),
  73. RenderableDrawer::RS_MATERIAL, COLOR_PASS, *(*it).node,
  74. (*it).subSpatialIndices, (*it).subSpatialIndicesCount);
  75. }
  76. // Gen mips
  77. //fai0.generateMipmaps();
  78. ANKI_CHECK_GL_ERROR();
  79. }
  80. } // end namespace anki