|Description||Dynamic rendering pipeline configured via the property tree|
|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
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>
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>
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);
- 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?