From 4ded0a640b440e1367b4057706e1a676781a34fd Mon Sep 17 00:00:00 2001 From: Jorge Bernal Date: Fri, 8 May 2020 23:46:36 +0200 Subject: [PATCH] UPBGE: Fix for Depth transparency Thanks to @youle31 for the code to recover it --- source/gameengine/Rasterizer/RAS_BucketManager.cpp | 10 ++++++++-- source/gameengine/Rasterizer/RAS_Rasterizer.cpp | 14 +++++++------- source/gameengine/Rasterizer/RAS_Rasterizer.h | 2 +- 3 files changed, 16 insertions(+), 10 deletions(-) diff --git a/source/gameengine/Rasterizer/RAS_BucketManager.cpp b/source/gameengine/Rasterizer/RAS_BucketManager.cpp index e467595f4526..1d93aaa9b714 100644 --- a/source/gameengine/Rasterizer/RAS_BucketManager.cpp +++ b/source/gameengine/Rasterizer/RAS_BucketManager.cpp @@ -34,9 +34,12 @@ # pragma warning (disable:4786) #endif +#include "KX_Globals.h" +#include "KX_KetsjiEngine.h" #include "RAS_MaterialBucket.h" #include "RAS_Mesh.h" #include "RAS_MeshUser.h" +#include "RAS_ICanvas.h" #include "RAS_IMaterial.h" #include "RAS_Rasterizer.h" @@ -45,6 +48,8 @@ #include /* sorting */ + + RAS_BucketManager::SortedMeshSlot::SortedMeshSlot(RAS_MeshSlot *ms, const mt::vec3& pnorm) :m_ms(ms) { @@ -269,7 +274,6 @@ void RAS_BucketManager::Renderbuckets(RAS_Rasterizer::DrawType drawingMode, cons /* Rendering solid and alpha (regular and instancing) materials * with their shaders. */ - m_nodeData.m_shaderOverride = false; rasty->SetDepthMask(RAS_Rasterizer::RAS_DEPTHMASK_ENABLED); @@ -280,7 +284,9 @@ void RAS_BucketManager::Renderbuckets(RAS_Rasterizer::DrawType drawingMode, cons // Update depth transparency depth texture after rendering all solid materials. if ((m_buckets[ALPHA_DEPTH_BUCKET].size() + m_buckets[ALPHA_DEPTH_INSTANCING_BUCKET].size()) > 0) { - rasty->UpdateGlobalDepthTexture(offScreen); + KX_KetsjiEngine *ketsji = KX_GetActiveEngine(); + RAS_ICanvas* canvas = ketsji->GetCanvas(); + rasty->UpdateGlobalDepthTexture(offScreen, canvas); } RenderBasicBuckets(rasty, ALPHA_INSTANCING_BUCKET); RenderSortedBuckets(rasty, ALPHA_BUCKET); diff --git a/source/gameengine/Rasterizer/RAS_Rasterizer.cpp b/source/gameengine/Rasterizer/RAS_Rasterizer.cpp index c449f1cb9931..8af470800994 100644 --- a/source/gameengine/Rasterizer/RAS_Rasterizer.cpp +++ b/source/gameengine/Rasterizer/RAS_Rasterizer.cpp @@ -1320,19 +1320,19 @@ void RAS_Rasterizer::LoadIdentity() m_impl->LoadIdentity(); } -void RAS_Rasterizer::UpdateGlobalDepthTexture(RAS_OffScreen *offScreen) +void RAS_Rasterizer::UpdateGlobalDepthTexture(RAS_OffScreen *offScreen, RAS_ICanvas *canvas) { /* In case of multisamples the depth off screen must be blit to be used in shader. * But the original off screen must be kept bound after the blit. */ - /*if (offScreen->GetSamples()) { - RAS_OffScreen *dstOffScreen = GetOffScreen(RAS_Rasterizer::RAS_OFFSCREEN_BLIT_DEPTH); - offScreen->Blit(dstOffScreen, false, true); + if (offScreen->GetSamples()) { + RAS_OffScreen *dstOffScreen = canvas->GetOffScreen(RAS_OffScreen::RAS_OFFSCREEN_BLIT_DEPTH); + offScreen->Blit(dstOffScreen, true); // Restore original off screen. offScreen->Bind(); offScreen = dstOffScreen; - } TODO utiliser mulisample comme single sample ?*/ - - GPU_texture_set_global_depth(offScreen->GetDepthTexture()); + } + GPUTexture* gputex = offScreen->GetDepthTexture(); + GPU_texture_set_global_depth(gputex); } void RAS_Rasterizer::ResetGlobalDepthTexture() diff --git a/source/gameengine/Rasterizer/RAS_Rasterizer.h b/source/gameengine/Rasterizer/RAS_Rasterizer.h index dbacd6411ca9..ab82b933d7e6 100644 --- a/source/gameengine/Rasterizer/RAS_Rasterizer.h +++ b/source/gameengine/Rasterizer/RAS_Rasterizer.h @@ -650,7 +650,7 @@ class RAS_Rasterizer : public mt::SimdClassAllocator /** Set the current off screen depth to the global depth texture used by materials. * In case of mutlisample off screen a blit to RAS_OFFSCREEN_BLIT_DEPTH is procceed. */ - void UpdateGlobalDepthTexture(RAS_OffScreen *offScreen); + void UpdateGlobalDepthTexture(RAS_OffScreen *offScreen, RAS_ICanvas *canvas); /// Set the global depth texture to an empty texture. void ResetGlobalDepthTexture();