]> git.lizzy.rs Git - minetest.git/commitdiff
Move updating shadows outside of RenderingCore::drawAll. (#11491)
authorx2048 <codeforsmile@gmail.com>
Thu, 12 Aug 2021 18:07:09 +0000 (20:07 +0200)
committerGitHub <noreply@github.com>
Thu, 12 Aug 2021 18:07:09 +0000 (20:07 +0200)
Fixes indirect rendering modes such as some 3D modes mentioned in #11437 and undersampled rendering.
Does not fully fix anaglyph 3d mode.

src/client/render/core.cpp
src/client/shadows/dynamicshadowsrender.cpp
src/client/shadows/dynamicshadowsrender.h
src/client/shadows/shadowsScreenQuad.cpp
src/client/shadows/shadowsScreenQuad.h
src/client/shadows/shadowsshadercallbacks.cpp
src/client/shadows/shadowsshadercallbacks.h

index 4a820f58394e43de66b206673867db0a60a01675..f151832f34fa00d75e80abac43d89345c5ac9173 100644 (file)
@@ -76,19 +76,18 @@ void RenderingCore::draw(video::SColor _skycolor, bool _show_hud, bool _show_min
        draw_wield_tool = _draw_wield_tool;
        draw_crosshair = _draw_crosshair;
 
+       if (shadow_renderer)
+               shadow_renderer->update();
+
        beforeDraw();
        drawAll();
 }
 
 void RenderingCore::draw3D()
 {
-       if (shadow_renderer) {
-               // Shadow renderer will handle the draw stage
-               shadow_renderer->setClearColor(skycolor);
-               shadow_renderer->update();
-       } else {
-               smgr->drawAll();
-       }
+       smgr->drawAll();
+       if (shadow_renderer)
+               shadow_renderer->drawDebug();
 
        driver->setTransform(video::ETS_WORLD, core::IdentityMatrix);
        if (!show_hud)
index 350586225b2f6fab708035737cb9780255e7da25..a913a9290af468a8210c516ebf646146891281bf 100644 (file)
@@ -146,11 +146,6 @@ void ShadowRenderer::removeNodeFromShadowList(scene::ISceneNode *node)
        }
 }
 
-void ShadowRenderer::setClearColor(video::SColor ClearColor)
-{
-       m_clear_color = ClearColor;
-}
-
 void ShadowRenderer::updateSMTextures()
 {
        if (!m_shadows_enabled || m_smgr->getActiveCamera() == nullptr) {
@@ -242,6 +237,7 @@ void ShadowRenderer::updateSMTextures()
                                // This is also handled in ClientMap.
                                if (m_current_frame == m_map_shadow_update_frames - 1) {
                                        if (m_shadow_map_colored) {
+                                               m_driver->setRenderTarget(0, false, false);
                                                m_driver->setRenderTarget(shadowMapTextureColors,
                                                                true, false, video::SColor(255, 255, 255, 255));
                                        }
@@ -273,7 +269,6 @@ void ShadowRenderer::updateSMTextures()
 void ShadowRenderer::update(video::ITexture *outputTarget)
 {
        if (!m_shadows_enabled || m_smgr->getActiveCamera() == nullptr) {
-               m_smgr->drawAll();
                return;
        }
 
@@ -308,36 +303,34 @@ void ShadowRenderer::update(video::ITexture *outputTarget)
                        m_driver->setRenderTarget(0, false, false);
 
                } // end for lights
+       }
+}
 
-               // now render the actual MT render pass
-               m_driver->setRenderTarget(outputTarget, true, true, m_clear_color);
-               m_smgr->drawAll();
-
-               /* this code just shows shadows textures in screen and in ONLY for debugging*/
-               #if 0
-               // this is debug, ignore for now.
-               m_driver->draw2DImage(shadowMapTextureFinal,
-                               core::rect<s32>(0, 50, 128, 128 + 50),
-                               core::rect<s32>({0, 0}, shadowMapTextureFinal->getSize()));
-
-               m_driver->draw2DImage(shadowMapClientMap,
-                               core::rect<s32>(0, 50 + 128, 128, 128 + 50 + 128),
-                               core::rect<s32>({0, 0}, shadowMapTextureFinal->getSize()));
-               m_driver->draw2DImage(shadowMapTextureDynamicObjects,
-                               core::rect<s32>(0, 128 + 50 + 128, 128,
-                                               128 + 50 + 128 + 128),
-                               core::rect<s32>({0, 0}, shadowMapTextureDynamicObjects->getSize()));
-
-               if (m_shadow_map_colored) {
-
-                       m_driver->draw2DImage(shadowMapTextureColors,
-                                       core::rect<s32>(128,128 + 50 + 128 + 128,
-                                                       128 + 128, 128 + 50 + 128 + 128 + 128),
-                                       core::rect<s32>({0, 0}, shadowMapTextureColors->getSize()));
-               }
-               #endif
-               m_driver->setRenderTarget(0, false, false);
+void ShadowRenderer::drawDebug()
+{
+       /* this code just shows shadows textures in screen and in ONLY for debugging*/
+       #if 0
+       // this is debug, ignore for now.
+       m_driver->draw2DImage(shadowMapTextureFinal,
+                       core::rect<s32>(0, 50, 128, 128 + 50),
+                       core::rect<s32>({0, 0}, shadowMapTextureFinal->getSize()));
+
+       m_driver->draw2DImage(shadowMapClientMap,
+                       core::rect<s32>(0, 50 + 128, 128, 128 + 50 + 128),
+                       core::rect<s32>({0, 0}, shadowMapTextureFinal->getSize()));
+       m_driver->draw2DImage(shadowMapTextureDynamicObjects,
+                       core::rect<s32>(0, 128 + 50 + 128, 128,
+                                       128 + 50 + 128 + 128),
+                       core::rect<s32>({0, 0}, shadowMapTextureDynamicObjects->getSize()));
+
+       if (m_shadow_map_colored) {
+
+               m_driver->draw2DImage(shadowMapTextureColors,
+                               core::rect<s32>(128,128 + 50 + 128 + 128,
+                                               128 + 128, 128 + 50 + 128 + 128 + 128),
+                               core::rect<s32>({0, 0}, shadowMapTextureColors->getSize()));
        }
+       #endif
 }
 
 
index 52b24a18f16c7b43d5ac50d9c000caee89404776..e4b3c3e220e213bc74bd9576a9b79d07d2d3162b 100644 (file)
@@ -73,9 +73,8 @@ class ShadowRenderer
                        E_SHADOW_MODE shadowMode = ESM_BOTH);
        void removeNodeFromShadowList(scene::ISceneNode *node);
 
-       void setClearColor(video::SColor ClearColor);
-
        void update(video::ITexture *outputTarget = nullptr);
+       void drawDebug();
 
        video::ITexture *get_texture()
        {
@@ -112,7 +111,6 @@ class ShadowRenderer
        video::ITexture *shadowMapTextureFinal{nullptr};
        video::ITexture *shadowMapTextureDynamicObjects{nullptr};
        video::ITexture *shadowMapTextureColors{nullptr};
-       video::SColor m_clear_color{0x0};
 
        std::vector<DirectionalLight> m_light_list;
        std::vector<NodeToApply> m_shadow_node_array;
index c36ee0d6028eb07b1f32a040d30c71459ee9ebe0..5f6d38157434490eb1ba4f8fda1f23f0e7f137f6 100644 (file)
@@ -51,17 +51,11 @@ void shadowScreenQuadCB::OnSetConstants(
                video::IMaterialRendererServices *services, s32 userData)
 {
        s32 TextureId = 0;
-       services->setPixelShaderConstant(
-               services->getPixelShaderConstantID("ShadowMapClientMap"),
-               &TextureId, 1);
+       m_sm_client_map_setting.set(&TextureId, services);
 
        TextureId = 1;
-       services->setPixelShaderConstant(
-               services->getPixelShaderConstantID("ShadowMapClientMapTraslucent"),
-               &TextureId, 1);
+       m_sm_client_map_trans_setting.set(&TextureId, services);
 
        TextureId = 2;
-       services->setPixelShaderConstant(
-               services->getPixelShaderConstantID("ShadowMapSamplerdynamic"),
-               &TextureId, 1);
+       m_sm_dynamic_sampler_setting.set(&TextureId, services);
 }
index e6cc95957887a97da79a349f40aa86278c12deea..c18be9a2b4272d11e9fcd52e702586e846c4d7fb 100644 (file)
@@ -21,6 +21,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "irrlichttypes_extrabloated.h"
 #include <IMaterialRendererServices.h>
 #include <IShaderConstantSetCallBack.h>
+#include "client/shader.h"
 
 class shadowScreenQuad
 {
@@ -38,8 +39,16 @@ class shadowScreenQuad
 class shadowScreenQuadCB : public video::IShaderConstantSetCallBack
 {
 public:
-       shadowScreenQuadCB(){};
+       shadowScreenQuadCB() :
+                       m_sm_client_map_setting("ShadowMapClientMap"),
+                       m_sm_client_map_trans_setting("ShadowMapClientMapTraslucent"),
+                       m_sm_dynamic_sampler_setting("ShadowMapSamplerdynamic")
+       {}
 
        virtual void OnSetConstants(video::IMaterialRendererServices *services,
                        s32 userData);
+private:
+       CachedPixelShaderSetting<s32> m_sm_client_map_setting;
+       CachedPixelShaderSetting<s32> m_sm_client_map_trans_setting;
+       CachedPixelShaderSetting<s32> m_sm_dynamic_sampler_setting;
 };
index 2f5797084df43ec479f68b08b7cc9ba007f9ea9e..65a63f49c7b4eb5ad44d2cf7cfe2da58a82d8fa8 100644 (file)
@@ -28,17 +28,9 @@ void ShadowDepthShaderCB::OnSetConstants(
        lightMVP *= driver->getTransform(video::ETS_VIEW);
        lightMVP *= driver->getTransform(video::ETS_WORLD);
 
-       services->setVertexShaderConstant(
-               services->getPixelShaderConstantID("LightMVP"),
-               lightMVP.pointer(), 16);
-
-       services->setVertexShaderConstant(
-               services->getPixelShaderConstantID("MapResolution"), &MapRes, 1);
-       services->setVertexShaderConstant(
-               services->getPixelShaderConstantID("MaxFar"), &MaxFar, 1);
-
+       m_light_mvp_setting.set(lightMVP.pointer(), services);
+       m_map_resolution_setting.set(&MapRes, services);
+       m_max_far_setting.set(&MaxFar, services);
        s32 TextureId = 0;
-       services->setPixelShaderConstant(
-               services->getPixelShaderConstantID("ColorMapSampler"), &TextureId,
-               1);
+       m_color_map_sampler_setting.set(&TextureId, services);
 }
index 43ad489f2cd76dd2790d9a0c073290c7daa01294..3549567c3ef5031c58f7a1369e57bd66cfeecef3 100644 (file)
@@ -21,14 +21,28 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "irrlichttypes_extrabloated.h"
 #include <IMaterialRendererServices.h>
 #include <IShaderConstantSetCallBack.h>
+#include "client/shader.h"
 
 class ShadowDepthShaderCB : public video::IShaderConstantSetCallBack
 {
 public:
+       ShadowDepthShaderCB() :
+                       m_light_mvp_setting("LightMVP"),
+                       m_map_resolution_setting("MapResolution"),
+                       m_max_far_setting("MaxFar"),
+                       m_color_map_sampler_setting("ColorMapSampler")
+       {}
+
        void OnSetMaterial(const video::SMaterial &material) override {}
 
        void OnSetConstants(video::IMaterialRendererServices *services,
                        s32 userData) override;
 
        f32 MaxFar{2048.0f}, MapRes{1024.0f};
+
+private:
+       CachedVertexShaderSetting<f32, 16> m_light_mvp_setting;
+       CachedVertexShaderSetting<f32> m_map_resolution_setting;
+       CachedVertexShaderSetting<f32> m_max_far_setting;
+       CachedPixelShaderSetting<s32> m_color_map_sampler_setting;
 };