From 98580d4e7374d0373e89fad0c1fd743b84b3dbbd Mon Sep 17 00:00:00 2001 From: Tony Leinonen Date: Thu, 10 Sep 2020 15:24:08 +0300 Subject: Fix disable depth test and disable depth prepass MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Disabling depth prepass in the editor never actually disabled the prepass. Flipping inEnableTransparentDepthWrite boolean corrects the if statement. Transparent objects were placed behind opaque objects when disable depth test was enabled in the editor. When disabling depth test objects are now drawn in a single pass with alpha test off. Task-number: QT3DS-4011 Change-Id: Ifb85520a3f9fd20d29e24c721623fd103b5b3797 Reviewed-by: Antti Määttä Reviewed-by: Tomi Korpipää --- src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderData.cpp | 4 ++-- .../rendererimpl/Qt3DSRendererImplLayerRenderPreparationData.cpp | 6 +++++- 2 files changed, 7 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderData.cpp b/src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderData.cpp index 0f08936..ea5a12f 100644 --- a/src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderData.cpp +++ b/src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderData.cpp @@ -874,7 +874,7 @@ namespace render { return; // Avoid running this method if possible. - if ((inEnableTransparentDepthWrite == false + if ((inEnableTransparentDepthWrite && ((m_GroupObjects.empty() && m_OpaqueObjects.empty() && m_TransparentObjects.empty()) || m_Layer.m_Flags.IsLayerEnableDepthPrepass() == false)) || m_Layer.m_Flags.IsLayerEnableDepthTest() == false) @@ -1165,7 +1165,6 @@ void SLayerRenderData::RunRenderPass(TRenderRenderableFunction inRenderFn, { QT3DS_PERF_SCOPED_TIMER(m_Renderer.GetQt3DSContext().GetPerfTimer(), "LayerRenderData: Render transparent pass1") - NVDataRef theTransparentObjects = GetTransparentRenderableObjects(); // Also draw opaque parts of transparent objects m_Renderer.setAlphaTest(true, 1.0f, -1.0f + (1.0f / 255.0f)); @@ -1189,6 +1188,7 @@ void SLayerRenderData::RunRenderPass(TRenderRenderableFunction inRenderFn, renderTransparentObjectsPass(inRenderFn, inEnableBlending, inEnableDepthWrite, inEnableTransparentDepthWrite, indexLight, inCamera, theFB); } + { QT3DS_PERF_SCOPED_TIMER(m_Renderer.GetQt3DSContext().GetPerfTimer(), "LayerRenderData: Render transparent pass3") diff --git a/src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderPreparationData.cpp b/src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderPreparationData.cpp index dc1185c..26d2c71 100644 --- a/src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderPreparationData.cpp +++ b/src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderPreparationData.cpp @@ -298,7 +298,7 @@ namespace render { m_RenderedTransparentObjects.assign(m_TransparentObjects.begin(), m_TransparentObjects.end()); - if (!m_Layer.m_Flags.IsLayerEnableDepthTest()) { + if (m_Layer.m_Flags.IsLayerEnableDepthTest() == false) { m_RenderedTransparentObjects.insert(m_RenderedTransparentObjects.end(), m_OpaqueObjects.begin(), m_OpaqueObjects.end()); m_RenderedTransparentObjects.insert(m_RenderedTransparentObjects.end(), @@ -314,7 +314,11 @@ namespace render { SRenderableObject &theInfo = *m_RenderedTransparentObjects[idx]; QT3DSVec3 difference = theInfo.m_WorldCenterPoint - theCameraPosition; theInfo.m_CameraDistanceSq = difference.dot(theCameraDirection); + + if (m_Layer.m_Flags.IsLayerEnableDepthTest() == false) + theInfo.m_RenderableFlags.setAlphaTest(0); } + ForwardingAllocator alloc(m_Renderer.GetPerFrameAllocator(), "SortAllocations"); // render furthest to nearest. eastl::merge_sort(m_RenderedTransparentObjects.begin(), -- cgit v1.2.3