Hi fellow wiki editors!

To help newly registered users get more familiar with the wiki (and maybe older users too) there is now a {{Welcome to the wiki}} template. Have a look at it and feel free to add it to new users discussion pages (and perhaps your own).

I have tried to keep the template short, but meaningful. /Johan G

Difference between revisions of "Compositor"

From FlightGear wiki
Jump to: navigation, search
m
m
Line 9: Line 9:
 
}}
 
}}
  
A '''Compositor''' is a rendering pipeline configured by the [[Property Tree]]. Every configurable element of the pipeline wraps a OpenGL/OSG object and exposes its parameters to the property tree.
+
A '''Compositor''' is a rendering pipeline configured by the [[Property Tree]]. Every configurable element of the pipeline wraps an OpenGL/OSG object and exposes its parameters to the property tree. This way, the rendering pipeline becomes dynamically-reconfigurable at runtime.
  
 
Related efforts: [[Howto:Canvas_View_Camera_Element]]
 
Related efforts: [[Howto:Canvas_View_Camera_Element]]
Line 19: Line 19:
 
A buffer represents a texture or, more generically, a region of GPU memory. Textures can be of any type allowed by OpenGL: 1D, 2D, rectangle, 2Darray, 3D or cubemap.
 
A buffer represents a texture or, more generically, a region of GPU memory. Textures can be of any type allowed by OpenGL: 1D, 2D, rectangle, 2Darray, 3D or cubemap.
  
A typical property tree structure describing a buffer may be as follows:
+
A typical [[PropertyList XML File|property tree structure]] describing a buffer may be as follows:
  
 
<syntaxhighlight lang="xml">
 
<syntaxhighlight lang="xml">
Line 36: Line 36:
 
=== Passes ===
 
=== Passes ===
  
A pass wraps around a osg::Camera. As of February 2018 there are two types of passes:
+
A pass wraps around an [http://public.vrac.iastate.edu/vancegroup/docs/OpenSceneGraphReferenceDocs-3.0/a00089.html osg::Camera]. As of February 2018, there are two types of passes supported:
  
* '''scene'''. Renders a scene. The scene can be an already loaded scene graph node (terrain, aircraft etc.) or a path to a custom model.
+
* '''scene'''. Renders a scene. The scene can be an already loaded scene graph node (terrain, aircraft etc.) or a path to a custom 3D model.
 
* '''quad'''. Renders a fullscreen quad with an optional effect applied. Useful for screen space shaders (like SSAO, Screen Space Reflections or bloom) and deferred rendering.
 
* '''quad'''. Renders a fullscreen quad with an optional effect applied. Useful for screen space shaders (like SSAO, Screen Space Reflections or bloom) and deferred rendering.
  
Line 63: Line 63:
 
[[File:Canvas&Compositor test.png|thumb|A fullscreen quad with a shader that colors everything magenta is rendered to a buffer, which is displayed by a Canvas Image.]]
 
[[File:Canvas&Compositor test.png|thumb|A fullscreen quad with a shader that colors everything magenta is rendered to a buffer, which is displayed by a Canvas Image.]]
  
Apart from serving as a debugging tool for visualizing the contents of a buffer, integrating the Compositor with [[Canvas]] allows aircraft developers to access RTT capabilities. Compositor buffers can be accessed within Canvas via the Canvas Image protocol '''buffer://'''. For example, the path buffer://test-compositor/test-buffer displays the buffer test-buffer declared in test-compositor.
+
Apart from serving as a debugging tool for visualizing the contents of a buffer, integrating the Compositor with [[Canvas]] allows aircraft developers to access RTT capabilities. Compositor buffers can be accessed within Canvas via a new custom Canvas Image protocol '''buffer://'''. For example, the path <code>buffer://test-compositor/test-buffer</code> displays the buffer test-buffer declared in test-compositor.
  
 
<syntaxhighlight lang="nasal">
 
<syntaxhighlight lang="nasal">

Revision as of 15:05, 27 February 2018

Compositor Subsystem
Canvas-view-element-prototype-by-icecode gl.png
Started in 01/2018
Description Dynamic rendering pipeline configured via the property tree
Maintainer(s) none
Contributor(s) Icecode
Status experimental as of 02/2018

A Compositor is a rendering pipeline configured by the Property Tree. Every configurable element of the pipeline wraps an OpenGL/OSG object and exposes its parameters to the property tree. This way, the rendering pipeline becomes dynamically-reconfigurable at runtime.

Related efforts: Howto:Canvas_View_Camera_Element

Elements

Buffers

A buffer represents a texture or, more generically, a region of GPU memory. Textures can be of any type allowed by OpenGL: 1D, 2D, rectangle, 2Darray, 3D or cubemap.

A typical property tree structure describing a buffer may be as follows:

      <buffer>
            <name>buffer-name</name>
	    <type>2d</type>
	    <width>512</width>
	    <height>512</height>
	    <scale-factor>1.0</scale-factor>
	    <internal-format>rgba8</internal-format>
	    <source-format>rgba</source-format>
            <source-type>ubyte</source-type>
      </buffer>

Passes

A pass wraps around an osg::Camera. As of February 2018, there are two types of passes supported:

  • scene. Renders a scene. The scene can be an already loaded scene graph node (terrain, aircraft etc.) or a path to a custom 3D model.
  • quad. Renders a fullscreen quad with an optional effect applied. Useful for screen space shaders (like SSAO, Screen Space Reflections or bloom) and deferred rendering.

Passes can render to a buffer (Render to Texture), to several buffers (Multiple Render Targets) or directly to the OSG context. This allows chaining of multiple passes, sharing buffers between them.

Example XML for a quad type pass:

      <pass>
          <type>quad</type>
          <name>pass-name</name>

          <effect>Effects/test.eff</effect>
    
          <output-buffer>
              <buffer>buffer-name</buffer>
              <component>color</component>
          </output-buffer>
      </pass>

Canvas integration

A fullscreen quad with a shader that colors everything magenta is rendered to a buffer, which is displayed by a Canvas Image.

Apart from serving as a debugging tool for visualizing the contents of a buffer, integrating the Compositor with Canvas allows aircraft developers to access RTT capabilities. Compositor buffers can be accessed within Canvas via a new custom Canvas Image protocol buffer://. For example, the path buffer://test-compositor/test-buffer displays the buffer test-buffer declared in test-compositor.

var (width,height) = (612,612);
var title = 'Compositor&Canvas test';
var window = canvas.Window.new([width,height],"dialog")
 .set('title',title);
var myCanvas = window.createCanvas().set("background", canvas.style.getColor("bg_color"));
var root = myCanvas.createGroup();
var path = "buffer://test-compositor/test-buffer";
var child = root.createChild("image")
    .setTranslation(50, 50)
    .setSize(512, 512)
    .setFile(path);

Known Issues

  • Canvas doesn't update its texture unless .update() is invoked in Nasal. Is this a feature?
  • The scene graph and the viewer are still managed by FGRenderer. Maybe hijacking the init sequence is a good idea?
  • Effects need that buffers are created before reading the .eff file. Maybe some kind of listener is needed ala Rembrandt?