diff --git a/src/graphics/irr_driver.hpp b/src/graphics/irr_driver.hpp index 689d6b007..110205de0 100644 --- a/src/graphics/irr_driver.hpp +++ b/src/graphics/irr_driver.hpp @@ -367,6 +367,7 @@ private: void renderParticles(); void computeSunVisibility(); void renderShadows(); + void renderRSM(); void renderGlow(std::vector& glows); void renderSSAO(); void renderLights(unsigned pointlightCount); diff --git a/src/graphics/render.cpp b/src/graphics/render.cpp index 30ce62227..28544dc33 100644 --- a/src/graphics/render.cpp +++ b/src/graphics/render.cpp @@ -281,7 +281,11 @@ void IrrDriver::renderScene(scene::ICameraSceneNode * const camnode, unsigned po m_scene_manager->setActiveCamera(m_suncam); if (!m_mipviz && !m_wireframe && UserConfigParams::m_dynamic_lights && UserConfigParams::m_shadows && !irr_driver->needUBOWorkaround() && hasShadow) + { renderShadows(); + if (UserConfigParams::m_gi) + renderRSM(); + } m_scene_manager->setActiveCamera(camnode); PROFILER_POP_CPU_MARKER(); } diff --git a/src/graphics/render_geometry.cpp b/src/graphics/render_geometry.cpp index cf042b2ce..baa6d6317 100644 --- a/src/graphics/render_geometry.cpp +++ b/src/graphics/render_geometry.cpp @@ -592,7 +592,7 @@ struct shadow_custom_unroll_args }; template -void renderShadow(const std::vector TextureUnits, const std::vector > *t) +void renderShadow(const std::vector TextureUnits, const std::vector > *t) { glUseProgram(T::getInstance()->Program); glBindVertexArray(getVAO(VertexType)); @@ -658,52 +658,6 @@ void renderInstancedShadow(const std::vector TextureUnits, const std::ve } } - -template -struct rsm_custom_unroll_args; - -template<> -struct rsm_custom_unroll_args<> -{ - template - static void exec(const core::matrix4 &rsm_matrix, const STK::Tuple &t, Args... args) - { - draw(T::getInstance(), STK::tuple_get<0>(t), rsm_matrix, args...); - } -}; - -template -struct rsm_custom_unroll_args -{ - template - static void exec(const core::matrix4 &rsm_matrix, const STK::Tuple &t, Args... args) - { - rsm_custom_unroll_args::template exec(rsm_matrix, t, STK::tuple_get(t), args...); - } -}; - - - - -template -void drawRSM(const core::matrix4 & rsm_matrix, const std::vector TextureUnits, const std::vector > *t) -{ - glUseProgram(T::getInstance()->Program); - glBindVertexArray(getVAO(VertexType)); - for (unsigned i = 0; i < t->size(); i++) - { - GLMesh *mesh = STK::tuple_get<0>(t->at(i)); - for (unsigned j = 0; j < TextureUnits.size(); j++) - { - if (!mesh->textures[j]) - mesh->textures[j] = getUnicolorTexture(video::SColor(255, 255, 255, 255)); - compressTexture(mesh->textures[j], true); - setTexture(TextureUnits[j], getTextureGLuint(mesh->textures[j]), GL_LINEAR, GL_LINEAR_MIPMAP_LINEAR, true); - } - rsm_custom_unroll_args::template exec(rsm_matrix, t->at(i)); - } -} - void IrrDriver::renderShadows() { glDepthFunc(GL_LEQUAL); @@ -746,16 +700,60 @@ void IrrDriver::renderShadows() renderInstancedShadow(std::vector{ MeshShader::InstancedGrassShadowShader::getInstance()->TU_tex }, ListInstancedMatGrass::getInstance()); glDisable(GL_POLYGON_OFFSET_FILL); +} - if (!UserConfigParams::m_gi) - return; + +template +struct rsm_custom_unroll_args; + +template<> +struct rsm_custom_unroll_args<> +{ + template + static void exec(const core::matrix4 &rsm_matrix, const STK::Tuple &t, Args... args) + { + draw(T::getInstance(), STK::tuple_get<0>(t), rsm_matrix, args...); + } +}; + +template +struct rsm_custom_unroll_args +{ + template + static void exec(const core::matrix4 &rsm_matrix, const STK::Tuple &t, Args... args) + { + rsm_custom_unroll_args::template exec(rsm_matrix, t, STK::tuple_get(t), args...); + } +}; + +template +void drawRSM(const core::matrix4 & rsm_matrix, const std::vector &TextureUnits, std::vector > *t) +{ + glUseProgram(T::getInstance()->Program); + glBindVertexArray(getVAO(VertexType)); + for (unsigned i = 0; i < t->size(); i++) + { + GLMesh *mesh = STK::tuple_get<0>(t->at(i)); + for (unsigned j = 0; j < TextureUnits.size(); j++) + { + if (!mesh->textures[j]) + mesh->textures[j] = getUnicolorTexture(video::SColor(255, 255, 255, 255)); + compressTexture(mesh->textures[j], true); + setTexture(TextureUnits[j], getTextureGLuint(mesh->textures[j]), GL_LINEAR, GL_LINEAR_MIPMAP_LINEAR, true); + } + rsm_custom_unroll_args::template exec(rsm_matrix, t->at(i)); + } +} + +void IrrDriver::renderRSM() +{ m_rtts->getRSM().Bind(); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); drawRSM(rsm_matrix, std::vector{ MeshShader::RSMShader::getInstance()->TU_tex }, ListMatDefault::getInstance()); drawRSM(rsm_matrix, std::vector{ MeshShader::RSMShader::getInstance()->TU_tex }, ListMatAlphaRef::getInstance()); -// drawRSM(rsm_matrix, std::vector{ MeshShader::RSMShader::getInstance()->TU_tex }, ListMatSphereMap::getInstance()); + drawRSM(rsm_matrix, std::vector{ MeshShader::RSMShader::getInstance()->TU_tex }, ListMatNormalMap::getInstance()); drawRSM(rsm_matrix, std::vector{ MeshShader::RSMShader::getInstance()->TU_tex }, ListMatUnlit::getInstance()); drawRSM(rsm_matrix, std::vector{ MeshShader::RSMShader::getInstance()->TU_tex }, ListMatDetails::getInstance()); drawRSM(rsm_matrix,