Hi Roland,

FYI, I've finally cleared the bulk of pending submissions and now
ready to dive into the really meaty one - shader composition :-)

No doubt there will be a lot for me to digest and think about.  If
there are any updates you have since this original post then please
feel free to provide updates.   I'll probably have quite a few
questions too....

Cheers,
Robert.

On Wed, Apr 7, 2010 at 10:33 PM, Roland Smeenk <[email protected]> wrote:
> Last year I was given time by my company (TNO) to look at building a shader 
> generation framework for OpenSceneGraph. This submission is the result of 
> that work and of the extra spare time I put in.
>
> The submission includes three major parts:
> -shader composition; shader generation in the OSG backed implementing most of 
> the FFP
> -osgshadermodetester; an example for interactive comparison of FFP with the 
> generated shader
> -parameter tweaker; used by above example for tweaking state variables
>
> My design goals were these:
> -easy transition from FFP to shader based pipeline for front-en users
> --use OSG paradigms
> --support complete Fixed Function Pipeline in shaders
> --allow mixing of FFP functionality with OSG features (skinning, shadows etc.)
> --allow custom shader functionality to be hooked into existing shader (FFP 
> with wind deflection, new types of lighting)
> -allow scaling between many small specific shaders and more generic shaders 
> that branch dynamically (optimal shaders vs. many switches)
> -allow visual shader debugging  (depth only, normals only, light only etc.)
> -allow completely new (non-visual) shaders (infrared, nvg simulation etc.)
> -support multipass and multiple rendertargets
> -allow custom renderer implementation (forward rendering vs deferred)
>
> OSGSHADERMODETESTER
>
> This example enables you to test how state changes will affect the FFP and 
> the shader based window. When started you will see two windows next to 
> eachother.
> Initially both windows will be showing FFP based rendering.
> -Press 'u' to show a HUD with the current parameter that can be tweaked.
> -The right arrow and left arrow keys will select the next parameter or part 
> of a parameter (between <> signs)
> -The up and down arrow keys will increase or decrease the value of the active 
> parameter (or part of it)
> -Note that parts of the parameters may be skipped if other parameters are 
> disabled. For instance disabling texture coordinate generation will also 
> prevent you from tweaking parameters related to texture coordinate generation.
> -When switching to parameter "1 Shader generation" you can enable or disable 
> shader generation for the left window
> -If a state is needed that can not be solved by using a shader available in 
> the shader cache, a new shader will be generated (see console for test 
> output).
>
> I added a few screenshots of this application as attachment. The application 
> allows you to switch between a few of the standard OSG models. Another 
> feature is switching between debug shaders for displaying normals and depth.
>
> SHADER COMPOSITION DESIGN & IMPLEMENTATION
>
> The basic idea: ShaderMode
>
> In analogy to how the OpenGL FFP uses modes, ShaderModes are introduced that 
> implement a piece of shader based functionality.
>
> StateAttributes are still used for controlling the pieces of functionality 
> inside a ShaderMode. However this may now include setting specific uniforms 
> instead of talking directly to the OpenGL API for setting state variables. 
> The State class will know which ShaderModes are needed if State::apply is 
> called. The collection of enabled ShaderModes form the set of wanted shader 
> program functionality. It is the task of the ShaderGenerator class to process 
> the given set of ShaderModes and produce a valid Shader Program.
> Each ShaderMode contains a list of input parameters that it needs to performs 
> it's job and a list of output parameters that it will produce or modify. 
> These lists will be used by the ShaderGenerator to link the ShaderModes and 
> determine in what order their code will be written.
> A ShaderMode will typically not be used by front end users of OpenSceneGraph, 
> because the modes will be enabled or disabled based on the usesMode mechanism 
> available inside StateAttributes.
> A MultiShaderMode is a specialization of ShaderMode to handle multiple 
> instances. This is used for instance for multiple textures or multiple 
> clipping planes. It only adds an index value as member. In some cases it 
> needs to care of things that only need to be done only once per class type 
> (for instance function generation).
>
> ShaderGenerator: how it works
>
> * Shader Cache
>
> The shadergenerator is given a set of needed ShaderModes for a certain shader 
> program. It first looks if this set of ShaderModes already exists in cache 
> and immediately returns a previously generated shader program if found.
>
> * Building a shadermode tree
>
> The generator then gathers a collection of rootmodes. A rootmode is a 
> ShaderMode that only has inputs and no outputs. Typically this will be the 
> part of the shader that writes to gl_FragColor. A minimum of one rootnode is 
> needed to be able to generate a ShaderMode tree. If none are found a default 
> purple shader is returned for debugging purposes. If one or more valid root 
> nodes are available the tree is built by searching for ShaderModes that can 
> provide the inputs requested by the shadermode being processed. ShaderModes 
> that provide the needed inputs will be added as a child node to the 
> ShaderMode being processed. If no valid ShaderMode is found that can provide 
> the input variable a constant value is used.
>
> * Building the vertex, geometry and fragment shaders
>
> Once the shadermode tree is complete the shader generation process is 
> started. The shadermode tree is traversed several times for each of the 
> defined shader blocks below. This occurs in a depth first order. There's a 
> flag to prevent endless looping through the generated ShaderMode tree.
>
> These are the code generation phases that currently are implemented:
>
> vertexfunction
> vertexvars
> vertexinit
> vertexmain
>
> geometryfunction
> geometryvars
> geometryinit
> geometrymain
>
> fragmentfunction
> fragmentvars
> fragmentinit
> fragmentmain
>
> This will allow all ShaderModes in the tree to inject their code into the 
> correct place. The generated Shader Program will be inserted in the cache and 
> returned as an answer to the requested set of ShaderModes. Note that some 
> ShaderModes may end up as orphans and will not be a part of the ShaderMode 
> tree. This may happen for instance if lighting is disabled, but lights are 
> requested. This is also the case if a debugging ShaderMode is used as root 
> (for instance showing the color coded Eye space normal) instead of the common 
> visual output ShaderMode.
>
> Of course there are a lot of things that are left to be desired, but 
> hopefully this will be a good start for integration of shader composition in 
> OpenSceneGraph.
>
> kind regards,
>
> Roland Smeenk
>
> ------------------
> Read this topic online here:
> http://forum.openscenegraph.org/viewtopic.php?p=26536#26536
>
>
>
>
> Attachments:
> http://forum.openscenegraph.org//files/truckdepth_671.jpg
> http://forum.openscenegraph.org//files/trucknormal_202.jpg
> http://forum.openscenegraph.org//files/truckvisual_159.jpg
> http://forum.openscenegraph.org//files/textureenv_487.jpg
> http://forum.openscenegraph.org//files/cowlightmaterial_898.jpg
> http://forum.openscenegraph.org//files/shader_composition_162.zip
>
>
> _______________________________________________
> osg-submissions mailing list
> [email protected]
> http://lists.openscenegraph.org/listinfo.cgi/osg-submissions-openscenegraph.org
>
_______________________________________________
osg-submissions mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-submissions-openscenegraph.org

Reply via email to