This is an old revision of the document!
Transparency
Transparency rendering is a huge topic in 3D development. A great deal of effort has been put into finding a perfect solution to the problem of correctly displaying transparency.
The most common but most bad solution is transparency sorting. Delphi FMX uses this algorithm, by sorting elements in z-order to camera position.
Take a further read at: https://www.khronos.org/opengl/wiki/Transparency_Sorting
The result is incorrect, which some of you already found out by using multiple components of a TTextLayer3D. FMX renders artifacts if rendering order is not correct which leads to bad results.
Order-Independent Rendering
With v0.8.1.x we implemented weighted blended order-independent transparency.
Link: http://casual-effects.blogspot.com/2014/03/weighted-blended-order-independent.html
This solution is more complex but leads to much better results, without any performance costs. In basically it renders all opaque objects at first. Afterwards it renders all translucent objects into a buffer by a specific algorithm. In the end all is merged together into the final image.
By implementing this method some significant changes have been made to Gorilla3D and to the usage of 3D elements. FMX already provides the “Opaque” property, but was not really used until now.
Usage
When building apps with transparent elements you now have to take care of the “Opaque” property. If you expect an object to be transparent (by color or by opacity value), you have to set Opaque to false. Is an object not transparent, you should leave Opaque to true. The “Opaque” property decides if an object is selected for opaque or translucent rendering inside of the rendering pipeline.
Advantages
Weighted Blended Order-Independent Transparency is fast in rendering and leads to good results without any performance costs. In deed it's a bit faster than by transparency sorting, but due to management overhead the results are quite even. As this is a stochastic algorithm, the limitations are crucial.
Limitations
Weighted Blended Order-Independent Transparency do not know zero transparency colors. This means, if you expect a nearly not-transparent object to be renderedm, it may lead to overlay problems. Declare an object as “Opaque := false” when you deal with an opacity/alpha value of less than 0.75.
Components
Gorilla3D components are all able to handle the weighted blended order-independent transparency rendering, but Delphi FMX objects are not!
Because there is no general way of intersecting FMX 3D components in rendering, we have to add to some code to each translucent 3D component used.
Inheritance
type TMyCube3D = class(TCube3D) protected procedure Render(); override; end; procedure TMyCube3D.Render(); begin // if WBOIT rendering is used and we have an opaque object, we need to // disable ZWrite but allow DepthTests -> this is not possible by FMX if (not Opaque) and (ZWrite) then begin Context.SetContextState(TContextState.csZWriteOff); Context.SetContextState(TContextState.csZTestOn); end; inherited; end;