Differences

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

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
Last revisionBoth sides next revision
0.8.3:viewport [2021/02/11 16:22] – [Native OpenGL Rendering] admin0.8.3:viewport [2022/04/06 19:29] – [UseFixedFrameRate] admin
Line 65: Line 65:
 ==== Requesting FrameRate (FPS) ==== ==== Requesting FrameRate (FPS) ====
  
-Currently it is not possible to retrieve an actual frameratebut the TGorillaViewport provides an estimated framerate value.+If UseFixedFrameRate is set to true, the FPS property returns the current frames per second. 
 +If UseFixedFrameRate is set to false, the TGorillaViewport provides an estimated framerate value.
  
 Simply setup a timer and request those value every 100 milliseconds. Simply setup a timer and request those value every 100 milliseconds.
Line 82: Line 83:
 Animation-Framerate (TAnimation): Because skin- and skeleton animation extends basic Firemonkey TAnimation. Therefore animations are limited to 30 FPS for rendering. Animation-Framerate (TAnimation): Because skin- and skeleton animation extends basic Firemonkey TAnimation. Therefore animations are limited to 30 FPS for rendering.
 ==== UseFixedFrameRate ==== ==== UseFixedFrameRate ====
 +
 +The viewport is able to render a scene on event feedback if visual component change or by a fixed framerate interval.
 +If UseFixedFrameRate is set to true, the rendering pipeline tries to render the scene with the configured FixedFrameRate value.
 +By default this value is set to 60.
 +
 +Notice: At design-time fixed framerate rendering is disabled due to limitations in IDE.
  
 ===== FrustumCulling ===== ===== FrustumCulling =====
Line 309: Line 316:
 Even in OnRender event you are in Gorilla3D rendering context. This means the framework has bound a framebuffer and the necessary render target textures. Even in OnRender event you are in Gorilla3D rendering context. This means the framework has bound a framebuffer and the necessary render target textures.
  
-This is very important to know. +**__Remark:__ It is recommended to only use opaque rendering, by setting elements to "Opaque := true;" 
-It is recommended to only use opaque rendering, by setting elements to "Opaque := true;". If the opaque property is false, you will render to translucent albedo channel.+ 
 +If the opaque property is false, you will render to translucent albedo channel. **
  
 __//CAUTION://__ This translucent render target is NOT a 1:1 represented color value. Instead it is weighted color value used later for compositing. __//CAUTION://__ This translucent render target is NOT a 1:1 represented color value. Instead it is weighted color value used later for compositing.
 +
 +To write a valid translucent albedo channel color value, you can have a look at the following GLSL implementation:
  
 <file glsl> <file glsl>
Line 319: Line 329:
 [...] [...]
  
 +// get the final REAL color value
 vec4 l_WBOITColor = gl_FragColor; vec4 l_WBOITColor = gl_FragColor;
  
 +// compute color-vertex-weight
 float l_Weight = max(min(1.0, max(max(l_WBOITColor.r, l_WBOITColor.g), l_WBOITColor.b) * l_WBOITColor.a), l_WBOITColor.a) * float l_Weight = max(min(1.0, max(max(l_WBOITColor.r, l_WBOITColor.g), l_WBOITColor.b) * l_WBOITColor.a), l_WBOITColor.a) *
   clamp(0.001 / (1e-5 + pow(v_WorldViewProjVertPos.z / 1000.0, 2.0)), 1e-5, 1e4);   clamp(0.001 / (1e-5 + pow(v_WorldViewProjVertPos.z / 1000.0, 2.0)), 1e-5, 1e4);
  
 +// compute a final weighted color value written to translucent albedo render target
 gl_FragColor = vec4(l_WBOITColor.rgb * l_Weight, l_Weight); gl_FragColor = vec4(l_WBOITColor.rgb * l_Weight, l_Weight);
 </file> </file>
 +
 +**__Remark:__ This is only necessary if Forward-Renderer is activated!**
  
 To understand rendering pipeline better, have a closer look [[renderpass|here]]. To understand rendering pipeline better, have a closer look [[renderpass|here]].
Line 333: Line 348:
 For advanced developers, we provide a legacy rendering pipeline, which allows you to do rendering yourself. For advanced developers, we provide a legacy rendering pipeline, which allows you to do rendering yourself.
 This will replace the easy-to-use forward-renderer by a basic renderer, which is sometimes better for native rendering. This will replace the easy-to-use forward-renderer by a basic renderer, which is sometimes better for native rendering.
 +The legacy implementation will only setup a single framebuffer with a single render target texture.
 +It will then render opaque elements at first and then all other elements.
  
 Read more about legacy rendering [[renderpass#legacy-renderer|here]]. Read more about legacy rendering [[renderpass#legacy-renderer|here]].