summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAntti Määttä <antti.maatta@qt.io>2019-06-20 12:48:15 +0300
committerAntti Määttä <antti.maatta@qt.io>2019-06-20 16:34:07 +0300
commit278a34e255942302b87808d96c128984d04bb7a2 (patch)
tree6d6f771f60dade526d3b92908958359719fec77c
parent74e1374b246f0b6d8c4560f052b9f880c41603ab (diff)
Premultiply clear color before clear
The framebuffer holds premultiplied colors so the clear color must be premultiplied before clearing. Task-number: QT3DS-3689 Change-Id: I5064321d2cacd21bcf9939b7ae195804938859aa Reviewed-by: Tomi Korpipää <tomi.korpipaa@qt.io> Reviewed-by: Mahmoud Badri <mahmoud.badri@qt.io> Reviewed-by: Jari Karppinen <jari.karppinen@qt.io> Reviewed-by: Pasi Keränen <pasi.keranen@qt.io>
-rw-r--r--src/runtimerender/Qt3DSRenderContextCore.cpp22
-rw-r--r--src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderData.cpp18
-rw-r--r--src/runtimerender/rendererimpl/Qt3DSRendererImplShaders.cpp1
3 files changed, 36 insertions, 5 deletions
diff --git a/src/runtimerender/Qt3DSRenderContextCore.cpp b/src/runtimerender/Qt3DSRenderContextCore.cpp
index 7c84a5a..b5f9bc9 100644
--- a/src/runtimerender/Qt3DSRenderContextCore.cpp
+++ b/src/runtimerender/Qt3DSRenderContextCore.cpp
@@ -708,6 +708,12 @@ struct SRenderContext : public IQt3DSRenderContext
theClearColor = m_MatteColor;
else if (m_SceneColor.hasValue())
theClearColor = m_SceneColor;
+ //premultiply the clear color
+ if (theClearColor.w < 1.0f) {
+ theClearColor.x *= theClearColor.w;
+ theClearColor.y *= theClearColor.w;
+ theClearColor.z *= theClearColor.w;
+ }
m_RenderContext->SetClearColor(theClearColor);
m_RenderContext->Clear(qt3ds::render::NVRenderClearValues::Color);
}
@@ -727,7 +733,13 @@ struct SRenderContext : public IQt3DSRenderContext
m_RotationDepthBuffer = NULL;
}
if (m_SceneColor.hasValue() && m_SceneColor.getValue().w != 0.0f) {
- m_RenderContext->SetClearColor(m_SceneColor);
+ QT3DSVec4 theClearColor = m_SceneColor;
+ if (theClearColor.w < 1.0f) {
+ theClearColor.x *= theClearColor.w;
+ theClearColor.y *= theClearColor.w;
+ theClearColor.z *= theClearColor.w;
+ }
+ m_RenderContext->SetClearColor(theClearColor);
m_RenderContext->Clear(qt3ds::render::NVRenderClearValues::Color);
}
} else {
@@ -758,7 +770,13 @@ struct SRenderContext : public IQt3DSRenderContext
}
m_RenderContext->SetRenderTarget(m_RotationFBO);
if (m_SceneColor.hasValue()) {
- m_RenderContext->SetClearColor(m_SceneColor);
+ QT3DSVec4 theClearColor = m_SceneColor;
+ if (theClearColor.w < 1.0f) {
+ theClearColor.x *= theClearColor.w;
+ theClearColor.y *= theClearColor.w;
+ theClearColor.z *= theClearColor.w;
+ }
+ m_RenderContext->SetClearColor(theClearColor);
m_RenderContext->Clear(qt3ds::render::NVRenderClearValues::Color);
}
}
diff --git a/src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderData.cpp b/src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderData.cpp
index 362a602..43934b1 100644
--- a/src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderData.cpp
+++ b/src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderData.cpp
@@ -1490,8 +1490,15 @@ namespace render {
theRenderContext, &NVRenderContext::GetViewport, &NVRenderContext::SetViewport,
theNewViewport);
QT3DSVec4 clearColor(0.0f);
- if (m_Layer.m_Background == LayerBackground::Color)
+ if (m_Layer.m_Background == LayerBackground::Color) {
clearColor = m_Layer.m_ClearColor;
+ // Framebuffer holds premultiplied colors so the clearcolor must be premultiplied
+ if (clearColor.w < 1.0f) {
+ clearColor.x *= clearColor.w;
+ clearColor.y *= clearColor.w;
+ clearColor.z *= clearColor.w;
+ }
+ }
NVRenderContextScopedProperty<QT3DSVec4> __clearColor(
theRenderContext, &NVRenderContext::GetClearColor, &NVRenderContext::SetClearColor,
@@ -1776,9 +1783,16 @@ namespace render {
theContext.SetScissorRect(
m_LayerPrepResult->GetLayerToPresentationScissorRect().ToIntegerRect());
if (m_Layer.m_Background == LayerBackground::Color) {
+ QT3DSVec4 clearColor = m_Layer.m_ClearColor;
+ // Framebuffer holds premultiplied colors so the clearcolor must be premultiplied
+ if (clearColor.w < 1.0f) {
+ clearColor.x *= clearColor.w;
+ clearColor.y *= clearColor.w;
+ clearColor.z *= clearColor.w;
+ }
NVRenderContextScopedProperty<QT3DSVec4> __clearColor(
theContext, &NVRenderContext::GetClearColor, &NVRenderContext::SetClearColor,
- m_Layer.m_ClearColor);
+ clearColor);
theContext.Clear(NVRenderClearValues::Color);
}
RenderToViewport();
diff --git a/src/runtimerender/rendererimpl/Qt3DSRendererImplShaders.cpp b/src/runtimerender/rendererimpl/Qt3DSRendererImplShaders.cpp
index a3d3fab..eb560aa 100644
--- a/src/runtimerender/rendererimpl/Qt3DSRendererImplShaders.cpp
+++ b/src/runtimerender/rendererimpl/Qt3DSRendererImplShaders.cpp
@@ -2399,7 +2399,6 @@ namespace render {
fragmentGenerator.Append("void main() {");
fragmentGenerator.Append("\tvec2 theCoords = uv_coords;\n");
fragmentGenerator.Append("\tvec4 theLayerTexture = texture2D( layer_image, theCoords );\n");
- fragmentGenerator.Append("\tif( theLayerTexture.a == 0.0 ) discard;\n");
fragmentGenerator.Append("\tfragOutput = theLayerTexture;\n");
fragmentGenerator.Append("}");
NVRenderShaderProgram *theShader = GetProgramGenerator().CompileGeneratedShader(