diff options
author | Antti Määttä <antti.maatta@qt.io> | 2019-08-29 15:03:13 +0300 |
---|---|---|
committer | Antti Määttä <antti.maatta@qt.io> | 2019-09-12 14:29:39 +0300 |
commit | bc4a0aa611242083403fd11f791f51cbab8d4f3a (patch) | |
tree | 3fa11a231a382513560f84db5a8b7999dd84d94b /src/runtimerender/resourcemanager/Qt3DSRenderBufferManager.cpp | |
parent | 18138ffc6b063e94b792ef61cbe310f90ea21287 (diff) |
Implement two-pass rendering for transparent objects
If object has both opaque parts and transparent parts it will be rendered
incorrectly due to no z-buffering. Add two-pass method to render the
opaque and transparent parts separately.
- Add opaque pixel check to transparency check of images.
- Add alpha test rendering to default material shadows too.
Task-number: QT3DS-3515
Change-Id: I9700b8fb463df9143c5bb9cbe66c7570081ebf5c
Reviewed-by: Miikka Heikkinen <miikka.heikkinen@qt.io>
Reviewed-by: Tomi Korpipää <tomi.korpipaa@qt.io>
Diffstat (limited to 'src/runtimerender/resourcemanager/Qt3DSRenderBufferManager.cpp')
-rw-r--r-- | src/runtimerender/resourcemanager/Qt3DSRenderBufferManager.cpp | 21 |
1 files changed, 17 insertions, 4 deletions
diff --git a/src/runtimerender/resourcemanager/Qt3DSRenderBufferManager.cpp b/src/runtimerender/resourcemanager/Qt3DSRenderBufferManager.cpp index eb23f3d..b140e85 100644 --- a/src/runtimerender/resourcemanager/Qt3DSRenderBufferManager.cpp +++ b/src/runtimerender/resourcemanager/Qt3DSRenderBufferManager.cpp @@ -154,11 +154,13 @@ struct SBufferManager : public IBufferManager return m_StrTable->RegisterStr(m_PathBuilder.c_str()); } - void SetImageHasTransparency(CRegisteredString inImagePath, bool inHasTransparency) override + void SetImageHasTransparency(CRegisteredString inImagePath, bool inHasTransparency, + bool hasOpaque) override { pair<TImageMap::iterator, bool> theImage = m_ImageMap.insert(make_pair(inImagePath, SImageEntry())); theImage.first->second.m_TextureFlags.SetHasTransparency(inHasTransparency); + theImage.first->second.m_TextureFlags.setHasOpaquePixels(hasOpaque); } bool GetImageHasTransparency(CRegisteredString inSourcePath) const override @@ -169,6 +171,14 @@ struct SBufferManager : public IBufferManager return false; } + bool GetImageHasOpaquePixels(CRegisteredString inSourcePath) const override + { + TImageMap::const_iterator theIter = m_ImageMap.find(inSourcePath); + if (theIter != m_ImageMap.end()) + return theIter->second.m_TextureFlags.HasOpaquePixels(); + return false; + } + void SetImageTransparencyToFalseIfNotSet(CRegisteredString inSourcePath) override { pair<TImageMap::iterator, bool> theImage = @@ -512,9 +522,12 @@ struct SBufferManager : public IBufferManager if (theDecompressedImage.data) inLoadedImage.ReleaseDecompressedTexture(theDecompressedImage); } - if (wasInserted == true || inForceScanForTransparency) - theImage.first->second.m_TextureFlags.SetHasTransparency( - inLoadedImage.ScanForTransparency()); + if (wasInserted || inForceScanForTransparency) { + auto &flags = theImage.first->second.m_TextureFlags; + bool alsoOpaquePixels = false; + flags.SetHasTransparency(inLoadedImage.ScanForTransparency(alsoOpaquePixels)); + flags.setHasOpaquePixels(alsoOpaquePixels); + } theImage.first->second.m_Texture = theTexture; return theImage.first->second; } |