As this is company code and part of a bigger framework I can only give you some hints.

I have a custom shader loader which parses the shader source in order to later add the defines and creates a osg::Program derived class
e.g. CustomProgram.

In GLSL you can use preprocessor macros like in C.
So you can say:

#define PATH_1

and later

vec4  color = vec4();
#ifdef PATH_1
    color = vec4(1,0,0,0);
#else
    color = vec4(0,0,1,0);
#endif

So the shader loader will create the CustomProgram which holds a list of defines which should be applied later. The CustomProgram itself will do this in the ::apply function, by injecting the #define %DEFINE_NAME% in to the shadersource before compiling it.

For setting the defines at the statesets you want, you can simply check the stateset for a program-attribute, cast it to CustomShader and add a define. You will have to do some management inside the CustomProgram to make it aware of changed define-sets etc. But it the end you are simply adding some custom attributes to control the compiled shader program at the state set, instead of setting uniforms directly.
While this seems complicated it allows for two things:
1. Fast less-branching shader code
2. Different sets of shaders realizing rendering based upon defines. In my case I can do deferred and forward shading with the same framework without having to know which one is running under the hood, when assigning materials/material effects.

cheers
Sebastian

Can you please provide an example of how an object manages its define-set?
In my case, I simply get the object's StateSet and setup uniforms. But I don't get how to setup defines.
Thanks.


2013/11/7 Sebastian Messerschmidt <[email protected] <mailto:[email protected]>>

    Am 07.11.2013 12:55, schrieb michael kapelko:
    Hi, Sebastian.

    So you compose one shader per object?
    No, one program per define-set (e.g. #define
    NORMAL_MAPPING,#define PARALLAX_MAPPING, ...)
    The idea is not to compose the shader from functional blocks, but
    to write one shader containing all paths which are activated based
    upon the defines.
    It is still complicated to get all the paths correctly in the
    ubershader, but i found it a good transition from uniform based
    de/activation.

    So you will end up with N different programs with N being the
    number of define-combinations used.



    Thanks.


    2013/11/7 Sebastian Messerschmidt <[email protected]
    <mailto:[email protected]>>

        Hi Michael,

        I solved a similar problem by overriding osg::Program which
        composes a shader from an Ubershader. This is not done via
        uniforms but defines.
        It seems to work somehow and improved the performance over
        branching based on uniforms.


        Hi.

        I decided to go with single pipeline that provides big
        shaders and objects using own uniforms and textures to
        change the pipeline behaviour.
        I started to design a simple material format so that it
        resembles the one of EffectCompositor.

        Thanks.


        2013/10/31 michael kapelko <[email protected]
        <mailto:[email protected]>>

            Hi, Wang.

            I've just checked if I can use some uber shader and
            control its behaviour per object by setting the object's
            uniforms. And it works.
            I wonder if that's ok to do that to make different
            objects rendered differently in the same scene.
            Thanks.


            2013/10/31 Wang Rui <[email protected]
            <mailto:[email protected]>>

                Hi Michael,

                Effect compositor in fact adds the child scene graph
                to a camera binding to a FBO, and then uses RTT
                cameras to perform the post processing work. The
                last step is always to show the final image on an
                HUD quad so all other scene nodes will be occluded.
                The only way to make the effect compositor work with
                other fixed pipeline nodes is to write to the depth
                values in the shader code of the last step, which
                cannot be automated.

                The dof.xml does such work so you may try
                ./osgeffectcompositor --normal-scene cessna.osg
                --effect dof.xml to see how normal and deferred
                shaded objects are merged. At present I haven't had
                a better idea about this problem. :-)

                Wang Rui



                2013/10/30 michael kapelko <[email protected]
                <mailto:[email protected]>>

                    Hi.
                    I've recently implemented deferred shading with
                    normal mapping and shadow mapping using
                    EffectCompositor, but it has effect on the whole
                    scene, not a single object.
                    Is it possible to use EffectCompositor to apply
                    effects per object?
                    Thanks.

                    _______________________________________________
                    osg-users mailing list
                    [email protected]
                    <mailto:[email protected]>
                    
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org



                _______________________________________________
                osg-users mailing list
                [email protected]
                <mailto:[email protected]>
                
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org





        _______________________________________________
        osg-users mailing list
        [email protected]  
<mailto:[email protected]>
        
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org


        _______________________________________________
        osg-users mailing list
        [email protected]
        <mailto:[email protected]>
        
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org




    _______________________________________________
    osg-users mailing list
    [email protected]  
<mailto:[email protected]>
    http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org


    _______________________________________________
    osg-users mailing list
    [email protected]
    <mailto:[email protected]>
    http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org




_______________________________________________
osg-users mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org

_______________________________________________
osg-users mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org

Reply via email to