I was thinking of creating some sort of material.xml and assign it to each object (or a group of objects). As far as I understand, the define approach creates one shader per object eventually. And that turns out to be faster than one shader per pipeline with different StateSets and uniforms per object. Am I correct? Thanks.
2013/11/7 Sebastian Messerschmidt <sebastian.messerschm...@gmx.de> > 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 <sebastian.messerschm...@gmx.de> > >> 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 <sebastian.messerschm...@gmx.de> >> >>> 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 <korn...@gmail.com> >>> >>>> 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 <wangra...@gmail.com> >>>> >>>>> 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 <korn...@gmail.com> >>>>> >>>>>> 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 >>>>>> osg-users@lists.openscenegraph.org >>>>>> >>>>>> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org >>>>>> >>>>>> >>>>> >>>>> _______________________________________________ >>>>> osg-users mailing list >>>>> osg-users@lists.openscenegraph.org >>>>> >>>>> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org >>>>> >>>>> >>>> >>> >>> >>> _______________________________________________ >>> osg-users mailing >>> listosg-users@lists.openscenegraph.orghttp://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org >>> >>> >>> >>> _______________________________________________ >>> osg-users mailing list >>> osg-users@lists.openscenegraph.org >>> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org >>> >>> >> >> >> _______________________________________________ >> osg-users mailing >> listosg-users@lists.openscenegraph.orghttp://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org >> >> >> >> _______________________________________________ >> osg-users mailing list >> osg-users@lists.openscenegraph.org >> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org >> >> > > > _______________________________________________ > osg-users mailing > listosg-users@lists.openscenegraph.orghttp://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org > > > > _______________________________________________ > osg-users mailing list > osg-users@lists.openscenegraph.org > http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org > >
_______________________________________________ osg-users mailing list osg-users@lists.openscenegraph.org http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org