[osg-users] Fine-grained render ordering

38 views
Skip to first unread message

Craig S. Bosma

unread,
Apr 22, 2011, 4:52:12 PM4/22/11
to OpenSceneGraph Users
Hi,

I'm working on a shader-driven graphics pipeline for an OSG-based app, and I want to better understand how I can better control the rendering order. I want to render my initial scene to several texture targets, with opaque and transparent objects handled separately. Currently I do this using node masks, but from this thread (http://forum.openscenegraph.org/viewtopic.php?t=2374) it seems like it would be better to use renderbin/renderstages. I have several more post-processing stages to follow, so I'm convinced that's the way to go for me to have full control over the pipeline.

I've dug into the source for SceneView, RenderBin, RenderStage, etc. but it's not obvious to me how to shift objects from one bin to another (aside from setRenderBinDetails), or how to add stages that form a dependency chain. If anyone has examples or general advice on where to look, I'd be glad to hear it.

Thanks,
Craig


Robert Osfield

unread,
Apr 26, 2011, 6:01:30 AM4/26/11
to OpenSceneGraph Users
Hi Craig,

The best way to manage render bin is vis State::setRenderBinDetails(),
and in the 2.9.x dev series you can now select a render bin that sorts
on traversal order of a subgrpah which makes some techniques easier -
use the RenderBin string "TraversalOrderBin" to select this bin.

If you want to create and chain RenderStages then using an osg::Camera
in the scene graph is often one of the best ways to do this, and use
the Camera::setRenderOrder(..) to control the order. You can also use
a custom cull traversal callback to create RenderStage/RenderBin and
assign these to the rendering backend, but this does require a greater
knowledge of the internals of the rendering backend.

Robert.

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

Craig S. Bosma

unread,
Apr 27, 2011, 10:38:11 AM4/27/11
to OpenSceneGraph Users
Robert,

Thanks for pointing out the "TraversalOrderBin", I wasn't aware of that. However, I'm still a little unclear on how that might help for my use. Suppose I have a scene with with a root Group node and two child Camera Nodes, A and B. Suppose both render to a texture via FBO, and that B needs A's texture output. If I put the root node in the "TraversalOrderBin", would that guarantee that camera A is rendered completely before camera B? What if A instead were a child of B?

Thanks,
Craig

Sergey Polischuk

unread,
Apr 28, 2011, 12:06:37 PM4/28/11
to OpenSceneGraph Users
Hi, Craig
In your example, put camera A as child of B with render order on camera A set to prerender.
 
Cheers, Sergey.
 
 
27.04.2011, 18:38, "Craig S. Bosma" <craig...@gmail.com>:

Craig S. Bosma

unread,
May 2, 2011, 8:17:17 AM5/2/11
to OpenSceneGraph Users
Will the same technique work with a third camera C?

Sent from my iPhone

Sergey Polischuk

unread,
May 3, 2011, 3:28:12 AM5/3/11
to OpenSceneGraph Users
Hi, Craig
 
When you have nested cameras they work like nested render stages. All cameras under another camera node will render just before or just after (depending on render order set on camera) rendering parent camera. With that in mind you can build hierarchy that suits your purposes.
 
Example : camera1 <- camera2
 
 
 
02.05.2011, 16:17, "Craig S. Bosma" <craig...@gmail.com>:

Sergey Polischuk

unread,
May 3, 2011, 3:30:31 AM5/3/11
to OpenSceneGraph Users
Sent incomplete message by accident :)
 
Example : camera1 <- camera2(prerender) <- camera4(prerender)
                             <- camera3(postrender)
 
render order will be camera4 (rendered first), camera2, camera3, camera1(rendered last)
 
Cheers, Sergey.
 
03.05.2011, 11:28, "Sergey Polischuk" <pol...@yandex.ru>:

Craig S. Bosma

unread,
May 6, 2011, 9:55:16 AM5/6/11
to OpenSceneGraph Users
Sergey,

Thanks, that's been very helpful. I have some other questions though: suppose you have a graph with camera C, a child of sibling cameras A & B, e.g.

A <- C
B <- C

Will C be rendered twice? If so, how would one make C render first, then render each of A, B with the output textures of C? Would it work to make C a child of A only, with A PRE_RENDER and B POST_RENDER?

Thanks,
Craig

Sergey Polischuk

unread,
May 7, 2011, 7:40:10 AM5/7/11
to OpenSceneGraph Users
Hi, Craig
 
Will C be rendered twice? <- yes
Would it work to make C a child of A only, with A PRE_RENDER and B POST_RENDER? <- yes
 
You could also use linear structure like A <- B <- C
 
Cheers, Sergey.
 
 
06.05.2011, 17:55, "Craig S. Bosma" <craig...@gmail.com>:

Riccardo Corsi

unread,
May 9, 2011, 5:06:53 AM5/9/11
to OpenSceneGraph Users
Hi,

is the render order index another option?
This is the index that Camera::SetRenderOrder() takes as the second parameter.
For instance if you place camera C in PreRender with index -1 and sibling A and B in PreRender with a greater index,
I think you should get what you're after.

Ricky


Reply all
Reply to author
Forward
0 new messages