summaryrefslogtreecommitdiffstats
path: root/src/runtimerender/resourcemanager/Qt3DSRenderBufferManager.cpp
diff options
context:
space:
mode:
authorAntti Määttä <antti.maatta@qt.io>2019-08-29 15:03:13 +0300
committerAntti Määttä <antti.maatta@qt.io>2019-09-12 14:29:39 +0300
commitbc4a0aa611242083403fd11f791f51cbab8d4f3a (patch)
tree3fa11a231a382513560f84db5a8b7999dd84d94b /src/runtimerender/resourcemanager/Qt3DSRenderBufferManager.cpp
parent18138ffc6b063e94b792ef61cbe310f90ea21287 (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.cpp21
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;
}