diff options
author | Antti Määttä <antti.maatta@qt.io> | 2019-06-20 12:48:15 +0300 |
---|---|---|
committer | Antti Määttä <antti.maatta@qt.io> | 2019-06-20 16:34:07 +0300 |
commit | 278a34e255942302b87808d96c128984d04bb7a2 (patch) | |
tree | 6d6f771f60dade526d3b92908958359719fec77c /src | |
parent | 74e1374b246f0b6d8c4560f052b9f880c41603ab (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>
Diffstat (limited to 'src')
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( |