summaryrefslogtreecommitdiffstats
path: root/src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderData.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderData.cpp')
-rw-r--r--src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderData.cpp132
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);
}