Urho
1.0.0.0
Urho.RefCounted
Rendering path definition.
rendering and any post-processing on a Viewport is defined by its RenderPath object, which can either be read from an XML file or be created programmatically.
The render path consists of rendertarget definitions and commands. The commands are executed in order to yield the rendering result. Each command outputs either to the destination rendertarget & viewport (default if output definition is omitted), or one of the named rendertargets. MRT output is also possible. If the rendertarget is a cube map,
the face to render to (0-5) can also be specified.
A rendertarget's size can be either absolute or multiply or divide the destination viewport size. The multiplier or divisor does not need to be an integer number. Furthermore, a rendertarget can be declared "persistent" so that it will not be mixed with other rendertargets of the same size and format, and its contents can be assumed to be available also on subsequent frames.
Note that if you already have created a named rendertarget texture in code and have stored it into the resource cache by using you can use it directly as an output (by referring to its name) without requiring a rendertarget definition for it.
The available commands are:
-
clear: Clear any of color, depth and stencil. Color clear can optionally use the fog color from the Zone visible at the far clip distance.
-
scenepass: Render scene objects whose contains the specified pass. Will either be front-to-back ordered with state sorting, or back-to-front ordered with no state sorting. For deferred rendering, object lightmasks can be optionally marked to the stencil buffer. Vertex lights can optionally be handled during a pass, if it has the necessary shader combinations. Textures global to the pass can be bound to free texture units; these can either be the viewport, a named rendertarget, or a texture resource identified with its pathname.
-
quad: Render a viewport-sized quad using the specified shaders and compilation defines. Textures can be bound and additionally shader parameters and the blend mode (default=replace) can be specified.
-
forwardlights: Render per-pixel forward lighting for opaque objects with the specified pass name. Shadow maps are also rendered as necessary.
-
lightvolumes: Render deferred light volumes using the specified shaders. G-buffer textures can be bound as necessary.
-
renderui: Render the UI into the output rendertarget. Using this will cause the default %UI render to the backbuffer to be skipped.
A render path can be loaded from a main XML file by calling , after which other XML files (for example one for each post-processing effect) can be appended to it by calling . Rendertargets and commands can be enabled or disabled by calling to switch eg. a post-processing effect on or off. To aid in this, both can be identified by tag names, for example the bloom effect uses the tag "Bloom" for all of its rendertargets and commands.
It is legal to both write to the destination viewport and sample from it during the same command: pingpong copies of its contents will be made automatically. If the viewport has hardware multisampling on, the multisampled backbuffer will be resolved to a texture before sampling it.
The render path XML definition looks like this:
]]>
For examples of renderpath definitions, see the default
forward, deferred and light pre-pass renderpaths in the
bin/CoreData/RenderPaths directory, and the postprocess
renderpath definitions in the bin/Data/PostProcess
directory.
Depth-stencil handling and reading scene depth
Normally needed depth-stencil surfaces are automatically
allocated when the render path is executed.
The special "lineardepth" (synonym "depth") format is
intended for storing scene depth in deferred rendering. It
is not an actual hardware depth-stencil texture, but a
32-bit single channel (R) float rendertarget. (On OpenGL2
it's RGBA instead, due to the limitation of all color
buffers having to be the same format. The shader include
file Samplers.glsl in bin/CoreData/Shaders/GLSL provides
functions to encode and decode linear depth to RGB.)
Writing depth manually to a rendertarget, while using a
non-readable depth-stencil surface ensures best
compatibility and prevents any conflicts from using both
depth test and manual depth sampling at the same time.
There is also a possibility to define a readable hardware
depth texture, and instruct the render path to use it
instead. Availability for this must first be checked with
the function GetReadableDepthSupport(). On Direct3D9 this
will use the INTZ "hack" format. To define a readable
depth-stencil texture, use the format "readabledepth"
(synonym "hwdepth") and set it as the depth-stencil by using
the "depthstencil" attribute in render path commands. Note
that you must set it in every command where you want to use
it, otherwise an automatically allocated depth-stencil will
be used. Note also that the existence of a stencil channel
is not guaranteed, so stencil masking optimizations for
lights normally used by the Renderer and View classes will be
disabled.
In the special case of a depth-only rendering pass you can
set the readable depth texture directly as the "output" and
don't need to specify the "depthstencil" attribute at all.
After the readable depth texture has been filled, it can be
bound to a texture unit in any subsequent commands. Pixel
shaders should use the ReconstructDepth() helper function to
reconstruct a linear depth value between 0-1 from the
nonlinear hardware depth value. When the readable depth
texture is bound for sampling, depth write is automatically
disabled, as both modifying and sampling the depth would be
undefined.
An example render path for readable hardware depth exists in
bin/CoreData/RenderPaths/ForwardHWDepth.xml:
]]>
The render path starts by allocating a readable depth-stencil
texture the same size as the destination viewport, clearing
its depth, then rendering a depth-only pass to it. Next the
destination color rendertarget is cleared normally, while the
readable depth texture is used as the depth-stencil for that
and all subsequent commands. Any command after the depth
render pass could now bind the depth texture to an unit for
sampling, for example for smooth particle or SSAO effects.
The ForwardDepth.xml render path does the same, but using a
linear depth rendertarget instead of a hardware depth
texture. The advantage is better compatibility (guaranteed to
work without checking ) but it has
worse performance as it will fill the hardware depth-stencil
twice.
Special Considerations for Forward Lighting
Otherwise fully customized scene render passes can be
specified, but there are a few things to remember related to
forward lighting:
The opaque base pass must be tagged with metadata
"base". When forward lighting logic does the lit base pass
optimization, it will search for a pass with the word "lit"
prepended, ie. if your custom opaque base pass is called
"custombase", the corresponding lit base pass would be
"litcustombase".
The transparent base pass must be tagged with metadata
"alpha". For lit transparent objects, the forward lighting
logic will look for a pass with the word "lit" prepended,
ie. if the custom alpha base pass is called "customalpha", the
corresponding lit pass is "litcustomalpha". The lit drawcalls
will be interleaved with the transparent base pass, and the
scenepass command should have back-to-front sorting enabled.
If forward and deferred lighting are mixed, the G-buffer
writing pass must be tagged with metadata "gbuffer" to prevent
geometry being double-lit also with forward lights.
Remember to mark the lighting mode (per-vertex / per-pixel)
into the techniques which define custom passes, as the lighting
mode can be guessed automatically only for the known default
passes.
The forwardlights command can optionally disable the
lit base pass optimization without having to touch the material
tech iques, if a separate opaque ambient-only base pass is needed. B default the optimization is enabled.
Special Considerations for Post-Processing Effects
Post-processing effects are usually implemented by using the
quad command. When using intermediate rendertargets that are
of different size than the viewport rendertarget, it is
necessary in shaders to reference their (inverse) size and the
half-pixel offset for Direct3D9. These shader uniforms are
automatically generated for named rendertargets. For an
example look at the bloom postprocess shaders: the
rendertarget called HBlur will define the shader uniforms
cHBlurInvSize and cHBlurOffsets (both Vector2.)
In OpenGL post-processing shaders it is important to
distinguish between sampling a rendertarget texture and a
regular texture resource, because intermediate rendertargets
(such as the G-buffer) may be vertically inverted. Use the
GetScreenPos() or GetQuadTexCoord() functions to get
rendertarget UV coordinates from the clip coordinates; this
takes flipping into account automatically. For sampling a
regular texture, use GetQuadTexCoordNoFlip() function, which
requires world coordinates instead of clip coordinates.
Constructor
1.0.0.0
Preserve
To be added.
To be added.
Constructor
1.0.0.0
Preserve
Pointer to the raw unmanaged Urho object.
Constructs a new instance of Urho.RenderPath, given a raw pointer to an unmanaged object
This creates a new managed wrapper for the type using the raw pointer to an unmanaged object.
Objects that are created in this fashion get registered with the UrhoSharp runtime.
This is intended to be used by the UrhoSharp runtime, and is not intended to be used by users.
Constructor
1.0.0.0
Preserve
Pass UrhoObjectFlag.Empty.
Empty constructor, chain to this constructor when you provide your own constructor that sets the handle field.
This constructor should be invoked by your code if you provide your own constructor that sets the handle field.
This essentially circumvents the default path that creates a new object and sets the handle and does not call RegisterObject on the target, you must do this on your own constructor.
You would typically chain to this constructor from your own, and then set the handle to the unmanaged object from your code, and then register your object.
Method
1.0.0.0
System.Void
To be added.
To be added.
To be added.
Method
1.0.0.0
System.Boolean
To be added.
To be added.
To be added.
To be added.
Method
1.0.0.0
Urho.RenderPath
Clone the rendering path.
To be added.
To be added.
Property
1.0.0.0
Urho.RenderPathCommand*[]
To be added.
To be added.
To be added.
Method
1.0.0.0
Urho.RenderPathCommand*
To be added.
Return command at index, or null if does not exist.
To be added.
To be added.
Method
1.0.0.0
System.Void
To be added.
To be added.
To be added.
To be added.
Method
1.0.0.0
System.Boolean
To be added.
To be added.
To be added.
To be added.
Method
1.0.0.0
System.Boolean
To be added.
To be added.
To be added.
To be added.
Method
1.0.0.0
System.Boolean
To be added.
To be added.
To be added.
To be added.
Property
1.0.0.0
System.UInt32
Return number of commands.
To be added.
To be added.
Property
1.0.0.0
System.UInt32
Return number of rendertargets.
To be added.
To be added.
Method
1.0.0.0
System.Void
To be added.
Remove a command by index.
To be added.
Method
1.0.0.0
System.Void
To be added.
Remove commands by tag name.
To be added.
Method
1.0.0.0
System.Void
To be added.
Remove a rendertarget by name.
To be added.
Method
1.0.0.0
System.Void
To be added.
Remove a rendertarget by index.
To be added.
Method
1.0.0.0
System.Void
To be added.
Remove rendertargets by tag name.
To be added.
Method
1.0.0.0
System.Void
To be added.
To be added.
To be added.
To be added.
Method
1.0.0.0
System.Void
To be added.
To be added.
Enable/disable commands and rendertargets by tag.
To be added.
Method
1.0.0.0
System.Void
To be added.
To be added.
To be added.
To be added.
Method
1.0.0.0
System.Void
To be added.
To be added.
Set a shader parameter in all commands that define it.
To be added.
Method
1.0.0.0
System.Void
To be added.
To be added.
Set a shader parameter in all commands that define it.
To be added.
Method
1.0.0.0
System.Void
To be added.
To be added.
Set a shader parameter in all commands that define it.
To be added.
Method
1.0.0.0
System.Void
To be added.
To be added.
Set a shader parameter in all commands that define it.
To be added.
Method
1.0.0.0
System.Void
To be added.
To be added.
Set a shader parameter in all commands that define it.
To be added.
Method
1.0.0.0
System.Void
To be added.
To be added.
Set a shader parameter in all commands that define it.
To be added.
Method
1.0.0.0
System.Void
To be added.
To be added.
To be added.
To be added.
Method
1.0.0.0
System.Void
To be added.
To be added.
To be added.
To be added.
Method
1.0.0.0
System.Void
To be added.
To be added.
Set a shader parameter in all commands that define it.
To be added.
Method
1.0.0.0
System.Void
To be added.
To be added.
Set a shader parameter in all commands that define it.
To be added.
Method
1.0.0.0
System.Void
To be added.
To be added.
Set a shader parameter in all commands that define it.
To be added.
Method
1.0.0.0
System.Void
To be added.
To be added.
Set a shader parameter in all commands that define it.
To be added.
Method
1.0.0.0
System.Void
To be added.
Toggle enabled state of commands and rendertargets by tag.
To be added.