| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 |
- #include "anki/renderer/Ms.h"
- #include "anki/renderer/Ez.h"
- #include "anki/renderer/Renderer.h"
- #include "anki/core/Logger.h"
- #include "anki/scene/Camera.h"
- #include "anki/scene/SceneGraph.h"
- namespace anki {
- //==============================================================================
- Ms::~Ms()
- {}
- //==============================================================================
- void Ms::init(const RendererInitializer& initializer)
- {
- try
- {
- #if ANKI_RENDERER_USE_MRT
- fai0.create2dFai(r->getWidth(), r->getHeight(), GL_RGBA8,
- GL_RGBA, GL_UNSIGNED_BYTE);
- fai1.create2dFai(r->getWidth(), r->getHeight(), GL_RG16F,
- GL_RG, GL_FLOAT);
- #else
- fai0.create2dFai(r->getWidth(), r->getHeight(), GL_RG32UI,
- GL_RG_INTEGER, GL_UNSIGNED_INT);
- #endif
- depthFai.create2dFai(r->getWidth(), r->getHeight(),
- GL_DEPTH24_STENCIL8, GL_DEPTH_STENCIL,
- GL_UNSIGNED_INT_24_8);
- fbo.create();
- #if ANKI_RENDERER_USE_MRT
- fbo.setColorAttachments({&fai0, &fai1});
- #else
- fbo.setColorAttachments({&fai0});
- #endif
- fbo.setOtherAttachment(GL_DEPTH_STENCIL_ATTACHMENT, depthFai);
- if(!fbo.isComplete())
- {
- throw ANKI_EXCEPTION("FBO is incomplete");
- }
- }
- catch(std::exception& e)
- {
- throw ANKI_EXCEPTION("Cannot create deferred "
- "shading material stage") << e;
- }
- ez.init(initializer);
- }
- //==============================================================================
- void Ms::run()
- {
- GlState& gl = GlStateSingleton::get();
- fbo.bind();
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
- gl.setViewport(0, 0, r->getWidth(), r->getHeight());
- gl.disable(GL_BLEND);
- gl.enable(GL_DEPTH_TEST);
- gl.setDepthFunc(GL_LESS);
- gl.setDepthMaskEnabled(true);
- if(ez.getEnabled())
- {
- glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
- ez.run();
- gl.setDepthFunc(GL_LEQUAL);
- glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
- //gl.setDepthMaskEnabled(false);
- }
- // render all
- r->getSceneDrawer().prepareDraw();
- VisibilityTestResults& vi =
- *r->getSceneGraph().getActiveCamera().getVisibilityTestResults();
- for(auto it = vi.getRenderablesBegin(); it != vi.getRenderablesEnd(); ++it)
- {
- r->getSceneDrawer().render(r->getSceneGraph().getActiveCamera(),
- RenderableDrawer::RS_MATERIAL, COLOR_PASS, *(*it).node,
- (*it).subSpatialIndices, (*it).subSpatialIndicesCount);
- }
- // Gen mips
- //fai0.generateMipmaps();
- ANKI_CHECK_GL_ERROR();
- }
- } // end namespace anki
|