I think use osg::Switch is right way to do.

You can set a StateSet to any Node, then (correct me if I'm wrong) all children 
will inherit the stateset.

So, I think about a graph like this:

 

    Root

       |

      ....

       |

     Switch

    ___|______________________________

    |                                                         |

    |                                                     
Node2->stateset(shader2)

Node1->stateset(shader1)                         |

    |_________________________________|

                                   |

                                   |

                              Rest of your graph

                                 ....

 

So you can insert this kind of switch to any subgraph which use another shader, 
you do not have to duplicates the rest of your subgraph since two parents can 
have the same child.

 

Another way (similar) is to use a simple group instead of the osg::Switch, but 
let osg to choose the good branch via nodeMask. In this way, you do not have to 
update your graph between to passes.

 

I hope it helps you.

 

Eric Z.

 

________________________________

De : [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] De la part de Viggo Løvli
Envoyé : jeudi 22 mai 2008 15:57
À : osg-users@lists.openscenegraph.org
Objet : [osg-users] Rendering the scene multiple times with differentshaders.

 

Hi,
 
My scene contains models that use one or many textures, some use vertex and 
fragment shaders of different kinds. Complex but good looking :-)
 
I need to render the scene many times each frame. 
The first render is a normal one, so I need no change in textures, states or 
shaders.
The second render is a multi target render. Here I need to change all the 
fragment shaders that my scene uses. Each shader need to output data to each 
render target. 
 
My question is:
- What is the best way to switch shaders on many models in my scene-graph?
 
One way to do it is to put a shader on the top node and override all child 
nodes, but that only works if the entire scene-graph renders with the same 
shader. My scene uses different shaders, so overriding is not the solution.
 
One idea I have is to parse through all scene graphs that I add to my world and 
duplicate all nodes that sets a fragment shader. I could then create one shader 
for the normal render and one for the multi target render. This would require 
that I mask those nodes so that the correct ones are used in each render. This 
will require me to write my own function for adding nodes to the scene.
 
Anyhow, I would be very happy if someone could guide me in the right direction 
on this one.
 
Regards,
Viggo
 

________________________________

Si det direkte med Windows Live Messenger. Lei av å vente på svar? 
<http://get.live.com/nb-no/messenger/overview> 

_______________________________________________
osg-users mailing list
osg-users@lists.openscenegraph.org
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org

Reply via email to