Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
layer3d [2020/11/04 14:55] – [DirectX-OpenGL Bridge] adminlayer3d [Unknown date] (current) – removed - external edit (Unknown date) 127.0.0.1
Line 1: Line 1:
-====== 2D FMX Components ====== 
  
-Gorilla3D supports all default 2D Firemonkey components, like TLabel, TButton, TEdit and so on. 
- 
-===== On top ===== 
- 
-You can add those components as child of the TGorillaViewport instance to show them on top of the rendered 3D world. 
- 
-<file pascal> 
-FLabel := TLabel.Create(FGorilla); 
-FLabel.Parent := FGorilla; 
-FLabel.Text := 'TEST'; 
-</file> 
- 
-===== Effects ===== 
-With version 0.8.2.x FMX effect components, like TGaussianBlurEffect, TPixelateEffect or TPaperSketchEffect are supported by Gorilla3D and can be applied to the TGorillaViewort as post-rendering effects. 
-This is a very easy way to modify the final rendering of your scenery without building your own post-effects. 
-The used TEffect component need to be enabled and the parent property linked to the viewport. 
- 
-{{:g3d_effect_1.jpg?nolink&400 |}} 
-{{:g3d_effect_2.jpg?nolink&400 |}} 
-{{:g3d_effect_3.jpg?nolink&400 |}} 
-===== Layers ===== 
- 
-You can also integrate them inside of a layer component, like TLayer3D, TTextLayer3D, ... 
-**Using a layer may lead to misleading result in first place due to false default settings in FMX.** 
- 
-==== Fix Resolution ==== 
- 
-One of the most popular used layer is a transparent 3D layer where 2D FMX components are placed into. 
- 
-With default FMX settings this would look simply horrible. 
- 
-Here an example of a TLayer3D with a TEdit, TLabel, TButton and TRadioButton component. 
- 
-{{ :layer3d-1.jpg?nolink&400 | defect layer rendering}} 
- 
-We need to change a few properties to get this working. 
-To fix the shredded 2D rendering, we need to reset the resolution to a higher value than 50. 
- 
-<file pascal> 
-// set resolution higher than 72 at a size of [width=8, height=4] 
-FLayer.Resolution := 72; 
-</file> 
- 
-==== Fix Transparency ==== 
- 
-**Since v0.8.1 take a look at: [[transparency|Transparency]]** 
- 
-__For elder versions:__ To fix the false transparency, we have to play around with opacity. 
-Due to original FMX rendering order list generation, the opacity influences the order. 
- 
-At the moment a component can only display 2 transparent children layers correctly. 
-<file pascal> 
-if (Left.Opacity < 1) and (Right.Opacity >= 1) then 
-  Result := 1 // left layer will be in front 
-else if (Left.Opacity >= 1) and (Right.Opacity < 1) then 
-  Result := -1 // right layer will be in front 
- </file> 
- 
-Setup for 2 layers: 
-<file pascal> 
-TGorillaViewport 
-    TDummy (Opacity = 0.999) 
-        TLayer3D (Opacity = 1, Transparency = true) 
-            TImage 
-        TLayer3D (Opacity = 0.999, Transparency = true) 
-            TLabel 
-</file> 
- 
-If we need more transparent layers, we need work around with TDummy objects. 
-<file pascal> 
-TGorillaViewport 
-    TDummy (Opacity = 1) 
-        TLayer3D (Opacity = 1, Transparency = true) 
-            TImage 
-        TDummy (Opacity = 0.999) 
-            TLayer3D (Opacity = 1, Transparency = true) 
-                TImage 
-            TLayer3D (Opacity = 0.999, Transparency = true) 
-                TLabel 
-</file> 
- 
-In the end, the result should look like this: 
- 
-{{ ::layer3d-2.jpg?nolink&400 |}} 
- 
-===== DirectX-OpenGL Bridge ===== 
- 
-**On Windows platforms** Firemonkey by default uses DirectX 9 or 11 as graphics library. But at the moment Gorilla3D only supports OpenGL 4.3. 
-So we integrated our OpenGL implementation compatible to DirectX. 
-But this brings some restrictions with it regarding texturing. 
- 
-__Bitmaps in FMX and DirectX:__ 
-  * When FMX creates a TBitmap instance it uses the TCanvasD2D component to build a buffer inside of DirectX. 
-  * This buffer uses a hardcoded BGRA image format (inside of FMX) with 1 byte per color (= 4 bytes per pixel) 
-  * The **pixels per row are memory aligned** and not the width multiplied with the bytes per pixel 
-  * Instead DirectX uses an alignment on each row (the height doesn't matter) - [pixel-width needs to be a multiple of 32px] 
- 
-__Textures in Gorilla3D and OpenGL:__ 
-  * We work with no byte alignment on rows of a texture buffer. So technically, it doesn't matter which size the image has 
-  * But - OpenGL expects textures to have a size of 2 ^ X (except render target textures) 
-  * We instanciate an additional workaround buffer of all the other image formats available 
-  * This produces more memory consumption (by duplicated buffers), but allows to use much more image formats, f.e. in shaders 
- 
-__DirectX-OpenGL interaction:__ 
-If using a TBitmap created by FMX and applying the image data to Gorilla3D shaders you may 
-produce some defect image data in rendering. 
-**Those defect data occurs as access-violation or by diagonal lines.** 
- 
-__Remarks:__ 
-  * Only apply or work with textures of a size 2 ^ X, so it's compatible to DirectX row-alignment and OpenGL texture-restriction 
-  * Take care of the image format used in Gorilla3D: only RGBA/BGRA is allowed, when applying bitmaps from FMX 
-  * By using other image formats in Gorilla3D shaders, the framework will produce duplicated buffers 
- 
-Next step: [[scripting|Scripting]]