From 7cb740b7dc1e7a660eaaab41cff2e4d76a9fd99f Mon Sep 17 00:00:00 2001 From: Janne Kangas Date: Fri, 21 Feb 2020 09:14:09 +0200 Subject: Fix blending issues in ordered group MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Task-id: QT3DS-4058 Change-Id: I4d13a506892f668a0fb94bfe49879675a33d16a7 Reviewed-by: Antti Määttä Reviewed-by: Tomi Korpipää --- .../rendererimpl/Qt3DSRendererImplLayerRenderData.cpp | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderData.cpp b/src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderData.cpp index e453c91..62ae506 100644 --- a/src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderData.cpp +++ b/src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderData.cpp @@ -911,6 +911,7 @@ void SLayerRenderData::renderOrderedGroup( QT3DSVec2 theCameraProps = QT3DSVec2(m_Camera->m_ClipNear, m_Camera->m_ClipFar); for (int i = 0; i < group.m_renderables.size(); ++i) { SRenderableObject &object(*group.m_renderables[i]); + const bool hasTransparency = object.m_RenderableFlags.HasTransparency(); SetShaderFeature(m_CGLightingFeatureName, m_Lights.empty() == false); SScopedLightsListScope lightsScope(m_Lights, m_LightDirections, m_SourceLightDirections, @@ -932,21 +933,27 @@ void SLayerRenderData::renderOrderedGroup( if (useBlendFallback) SetupDrawFB(true); #endif - if (object.m_RenderableFlags.hasAlphaTest()) { + if (object.m_RenderableFlags.hasAlphaTest() || hasTransparency) { theRenderContext.SetBlendingEnabled(false); - theRenderContext.SetDepthWriteEnabled(opaqueDepthWrite); + theRenderContext.SetDepthWriteEnabled(opaqueDepthWrite + && object.m_RenderableFlags.hasAlphaTest()); m_Renderer.setAlphaTest(true, 1.0f, -1.0f + (1.0f / 255.0f)); inRenderFn(*this, object, theCameraProps, GetShaderFeatureSet(), indexLight, inCamera); + theRenderContext.SetDepthTestEnabled(false); theRenderContext.SetBlendingEnabled(inEnableBlending); - theRenderContext.SetDepthWriteEnabled(inEnableTransparentDepthWrite); + theRenderContext.SetDepthWriteEnabled(inEnableTransparentDepthWrite + && object.m_RenderableFlags.hasAlphaTest()); m_Renderer.setAlphaTest(true, -1.0f, 1.0f); inRenderFn(*this, object, theCameraProps, GetShaderFeatureSet(), indexLight, inCamera); m_Renderer.setAlphaTest(false, 1.0, 1.0); + inRenderFn(*this, object, theCameraProps, GetShaderFeatureSet(), indexLight, + inCamera); } else { const bool transparency = object.m_RenderableFlags.HasTransparency() && inEnableBlending; + theRenderContext.SetDepthTestEnabled(opaqueDepthTest); theRenderContext.SetBlendingEnabled(transparency); theRenderContext.SetDepthWriteEnabled((!transparency && opaqueDepthWrite) || inEnableTransparentDepthWrite); -- cgit v1.2.3