Hi Eric,

It looks to me like using the switch could be the solution for my needs.
I think that it would either have to be a switch, or a mask.

An example of what I want to do could be written like this:

Original part of my scene graph:
  Root
    |
    +--Node_1 (Specifies a states and a fragment shader)
    |    |
    |    +--Node_2 (Specifies a geometry to be rendered)
    |    |
    |    +--Node_3 (Specifies another geometry to be rendered)

Using the switch to make sure I can render the scene twice with different 
shader:
  Root

    |
    +--Switch
    |    |

    |    +--Node_1 (Specifies states and a fragment shader)

    |    |    |
    |    |    +--Node_2 (Specifies a geometry to be rendered)
    |    |    |
    |    |    +--Node_3 (Specifies another geometry to be rendered)
    |    |


    |    +--Node_4 (This is a clone of Node_1 where I have added a new shader)

    |    |    |

    |    |    +--Node_2 (This is the same node as Node_2 above)

    |    |    |

    |    |    +--Node_3 (This is the same node as Node_3 above)

    |    |


Conclusion: 
    - The switch will let one scene render use Node_1 and another scene render 
use Node_4.

Using a mask to achieve the same effect:
  Root


    |
    +--Node_1 (Specifies states and a fragment shader, MASK = 0x1)


    |    |

    |    +--Node_2 (Specifies a geometry to be rendered)

    |    |

    |    +--Node_3 (Specifies another geometry to be rendered)

    |



    +--Node_4 (This is a clone of Node_1 where I have added a new shader, MASK 
= 0x2)


    |    |


    |    +--Node_2 (This is the same node as Node_2 above)


    |    |


    |    +--Node_3 (This is the same node as Node_3 above)


    |



Conclusion: 
    - This should work as far as I have understood the mask system, and this 
time I do not need the switch node.
    - In this solution I would not need to alter the position of Node_1 in the 
tree.

It is essential for me to have a solution where I do not need to do any work in 
between each time I render the scene.

Viggo




Date: Thu, 22 May 2008 17:14:09 +0200
From: [EMAIL PROTECTED]
To: [email protected]
Subject: Re: [osg-users] Rendering the scene multiple times with        
differentshaders.



















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

À :
[email protected]

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?







_________________________________________________________________
Del personlige filer, bilder og videoer med Windows Live Messenger.
http://get.live.com/nb-no/messenger/overview
_______________________________________________
osg-users mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org

Reply via email to