diff options
Diffstat (limited to 'src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderData.cpp')
-rw-r--r-- | src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderData.cpp | 132 |
1 files changed, 62 insertions, 70 deletions
diff --git a/src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderData.cpp b/src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderData.cpp index eb06cb0..3c0f541 100644 --- a/src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderData.cpp +++ b/src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderData.cpp @@ -1025,44 +1025,55 @@ void SLayerRenderData::renderTransparentObjectsPass( for (QT3DSU32 idx = 0, end = theTransparentObjects.size(); idx < end; ++idx) { SRenderableObject &theObject(*theTransparentObjects[idx]); if (!(theObject.m_RenderableFlags.IsCompletelyTransparent())) { + if (theObject.m_RenderableFlags.isOrderedGroup()) { + renderOrderedGroup(theObject, inRenderFn, inEnableBlending, + inEnableDepthWrite, inEnableTransparentDepthWrite, + indexLight, inCamera, theFB); + } else { #ifdef ADVANCED_BLEND_SW_FALLBACK - // SW fallback for advanced blend modes. - // Renders transparent objects to a separate FBO and blends them in shader - // with the opaque items and background. - DefaultMaterialBlendMode::Enum blendMode - = DefaultMaterialBlendMode::Enum::Normal; - if (theObject.m_RenderableFlags.IsDefaultMaterialMeshSubset()) - blendMode = static_cast<SSubsetRenderable &>(theObject).getBlendingMode(); - bool useBlendFallback - = (blendMode == DefaultMaterialBlendMode::Overlay - || blendMode == DefaultMaterialBlendMode::ColorBurn - || blendMode == DefaultMaterialBlendMode::ColorDodge) - && !theRenderContext.IsAdvancedBlendHwSupported() - && !theRenderContext.IsAdvancedBlendHwSupportedKHR() - && m_LayerPrepassDepthTexture; - if (useBlendFallback) - SetupDrawFB(true); + // SW fallback for advanced blend modes. + // Renders transparent objects to a separate FBO and blends them in shader + // with the opaque items and background. + DefaultMaterialBlendMode::Enum blendMode + = DefaultMaterialBlendMode::Enum::Normal; + if (theObject.m_RenderableFlags.IsDefaultMaterialMeshSubset()) + blendMode = static_cast<SSubsetRenderable &>(theObject).getBlendingMode(); + bool useBlendFallback + = (blendMode == DefaultMaterialBlendMode::Overlay + || blendMode == DefaultMaterialBlendMode::ColorBurn + || blendMode == DefaultMaterialBlendMode::ColorDodge) + && !theRenderContext.IsAdvancedBlendHwSupported() + && !theRenderContext.IsAdvancedBlendHwSupportedKHR() + && m_LayerPrepassDepthTexture; + if (useBlendFallback) + SetupDrawFB(true); #endif - SScopedLightsListScope lightsScope(m_Lights, m_LightDirections, - m_SourceLightDirections, - theObject.m_ScopedLights); - SetShaderFeature(m_CGLightingFeatureName, m_Lights.empty() == false); + SScopedLightsListScope lightsScope(m_Lights, m_LightDirections, + m_SourceLightDirections, + theObject.m_ScopedLights); + SetShaderFeature(m_CGLightingFeatureName, m_Lights.empty() == false); + + if (theObject.m_RenderableFlags.hasAlphaTest()) + m_Renderer.setAlphaTest(true, -1.0f, 1.0f); + else + m_Renderer.setAlphaTest(false, 1.0f, 1.0f); - inRenderFn(*this, theObject, theCameraProps, GetShaderFeatureSet(), - indexLight, inCamera); + inRenderFn(*this, theObject, theCameraProps, GetShaderFeatureSet(), + indexLight, inCamera); #ifdef ADVANCED_BLEND_SW_FALLBACK - // SW fallback for advanced blend modes. - // Continue blending after transparent objects have been rendered to a FBO - if (useBlendFallback) { - BlendAdvancedToFB(blendMode, true, theFB); - // restore blending status - theRenderContext.SetBlendingEnabled(inEnableBlending); - // restore depth test status - theRenderContext.SetDepthTestEnabled( - m_Layer.m_Flags.IsLayerEnableDepthTest()); - theRenderContext.SetDepthWriteEnabled(inEnableTransparentDepthWrite); - } + // SW fallback for advanced blend modes. + // Continue blending after transparent objects have been rendered to a FBO + if (useBlendFallback) { + BlendAdvancedToFB(blendMode, true, theFB); + // restore blending status + theRenderContext.SetBlendingEnabled(inEnableBlending); + // restore depth test status + theRenderContext.SetDepthTestEnabled( + m_Layer.m_Flags.IsLayerEnableDepthTest()); + theRenderContext.SetDepthWriteEnabled(inEnableTransparentDepthWrite); + } #endif + } } } } @@ -1102,6 +1113,12 @@ void SLayerRenderData::renderTransparentObjectsPass( m_SourceLightDirections, theObject.m_ScopedLights); SetShaderFeature(m_CGLightingFeatureName, m_Lights.empty() == false); + + if (theObject.m_RenderableFlags.hasAlphaTest()) + m_Renderer.setAlphaTest(true, -1.0f, 1.0f); + else + m_Renderer.setAlphaTest(false, 1.0f, 1.0f); + inRenderFn(*this, theObject, theCameraProps, GetShaderFeatureSet(), indexLight, inCamera); #ifdef ADVANCED_BLEND_SW_FALLBACK @@ -1142,31 +1159,19 @@ void SLayerRenderData::RunRenderPass(TRenderRenderableFunction inRenderFn, for (QT3DSU32 idx = 0, end = theOpaqueObjects.size(); idx < end; ++idx) { SRenderableObject &theObject(*theOpaqueObjects[idx]); - if (theObject.m_RenderableFlags.isOrderedGroup()) { - renderOrderedGroup(theObject, inRenderFn, inEnableBlending, inEnableDepthWrite, - inEnableTransparentDepthWrite, indexLight, inCamera, theFB); - } else { - theRenderContext.SetBlendingEnabled(false); - theRenderContext.SetDepthWriteEnabled(opaqueDepthWrite); - SetShaderFeature(m_CGLightingFeatureName, m_Lights.empty() == false); - SScopedLightsListScope lightsScope(m_Lights, m_LightDirections, m_SourceLightDirections, - theObject.m_ScopedLights); - inRenderFn(*this, theObject, theCameraProps, GetShaderFeatureSet(), indexLight, - inCamera); - } - } - } - { - QT3DS_PERF_SCOPED_TIMER(m_Renderer.GetQt3DSContext().GetPerfTimer(), - "LayerRenderData: Render transparent pass1") - NVDataRef<SRenderableObject *> theTransparentObjects = GetTransparentRenderableObjects(); - // Also draw opaque parts of transparent objects - m_Renderer.setAlphaTest(true, 1.0f, -1.0f + (1.0f / 255.0f)); - for (QT3DSU32 idx = 0, end = theTransparentObjects.size(); idx < end; ++idx) { - SRenderableObject &theObject(*theTransparentObjects[idx]); + QT3DS_ASSERT(!theObject.m_RenderableFlags.isOrderedGroup()); + + theRenderContext.SetBlendingEnabled(false); + theRenderContext.SetDepthWriteEnabled(opaqueDepthWrite); + SetShaderFeature(m_CGLightingFeatureName, m_Lights.empty() == false); SScopedLightsListScope lightsScope(m_Lights, m_LightDirections, m_SourceLightDirections, theObject.m_ScopedLights); - SetShaderFeature(m_CGLightingFeatureName, m_Lights.empty() == false); + + if (theObject.m_RenderableFlags.hasAlphaTest()) + m_Renderer.setAlphaTest(true, 1.0f, -1.0f + (1.0f / 255.0f)); + else + m_Renderer.setAlphaTest(false, 1.0f, 1.0f); + inRenderFn(*this, theObject, theCameraProps, GetShaderFeatureSet(), indexLight, inCamera); } @@ -1174,20 +1179,7 @@ void SLayerRenderData::RunRenderPass(TRenderRenderableFunction inRenderFn, { QT3DS_PERF_SCOPED_TIMER(m_Renderer.GetQt3DSContext().GetPerfTimer(), - "LayerRenderData: Render transparent pass2") - m_Renderer.setAlphaTest(true, -1.0f, 1.0f); - // transparent parts of transparent objects - // does not render objects without alpha test enabled so - // we need another pass without alpha test - renderTransparentObjectsPass(inRenderFn, inEnableBlending, inEnableDepthWrite, - inEnableTransparentDepthWrite, indexLight, inCamera, theFB); - } - - { - QT3DS_PERF_SCOPED_TIMER(m_Renderer.GetQt3DSContext().GetPerfTimer(), - "LayerRenderData: Render transparent pass3") - m_Renderer.setAlphaTest(false, 1.0, 1.0); - // transparent objects without alpha test + "LayerRenderData: Render transparent pass") renderTransparentObjectsPass(inRenderFn, inEnableBlending, inEnableDepthWrite, inEnableTransparentDepthWrite, indexLight, inCamera, theFB); } |