Re: [osg-users] Rendering transparent/opaque objects separately in deferred renderer using osg::RenderBin - how?

2009-04-27 Thread Robert Osfield
HI Jirka,

Post processing generated the RenderStage/RenderBin's after the cull
traversals has complete on a subgraph can be a useful way to manage
techniques like your are suggesting, it does require you to understand
the details of the rendering backend though so it's not something I
would recommend for most users - it's very much an advanced topic.  If
it's appropriate in your case it may well make life much easier once
you've over come the initial learning curve on it, I'm afraid there is
no shot cut - learning from the source code in this instance will be
your best bet.

One thing you can do with the rendering back end is to create new
bins/stages and also move bins around.  In your case if you want to
handle the whole transparent bin separately then creating a separate
RenderStage for it, then moving the bin from it's original RenderStage
to it's new one could be done with a couple of lines of code.   This
would be better than trying to play games of switch on/off rendering
via state.

The other appropriate you could take is to use traversal masks for
opaque and transparent objects and use two camera that do rendering to
texture, and use different cull traversal masks for each camera to
pick out the different parts of the scene graph.  You'd need to apply
the different masks to the geodes that contains opaque and transparent
geometry.  This approach won't be quite as fast as the RenderBin
management done via a cull callback due to the extra traversals
required, but it would probably be easier in terms of using the OSG
front end, rather than the back end as the front end of the OSG is
better documented and cleaner (it's the public API that is meant to be
used, the back end is just the implementation so this is a natural
balance.)


Robert.

On Sun, Apr 26, 2009 at 10:39 AM, Jirka h-i...@seznam.cz wrote:
 Hi,

 I work on a deferred renderer for my master thesis. Everything is fine and 
 now I want to correctly render transparent objects. I want to use forward 
 rendering for that taks - just render the transparent objects in one pass, 
 blend them together and add it to buffer of rendered opaque objects (by 
 deferred rendering).

 The problem is that I don't now how to correctly access opaque/transparent 
 objects in my scene graph to render them separately and combine them in the 
 final stage of deferred renderer. I have found a disscussion 
 http://lists.openscenegraph.org/pipermail/osg-users-openscenegraph.org/2008-July/014769.html
  where access to render bin #10 (which should always contain transparent 
 geometry ?) is described. So I got and idea that I could create my custom 
 scene graph node (derived from osg::Geode) and redefine its traversal method, 
 where I would discard the render bin for transparent/opaque objects after 
 the cull traversal.
 I modified the code from the discussion a little bit and I mask depth and 
 color buffer for writing when rendering transparent objects (don't know how 
 to acctually remove transparent drawables from particular render bin):


 Code:

 void RenderBinMaskNode::traverse(osg::NodeVisitor nv) {

    this-osg::Group::traverse( nv );

    // Clone render-bin 10 if this is a cull visitor
    if ( nv.getVisitorType() == osg::NodeVisitor::CULL_VISITOR ) {

        osgUtil::CullVisitor* cv = dynamic_castosgUtil::CullVisitor*( nv );

        if ( cv ) {
            // Act if we have a RenderStage pointer
            if ( osgUtil::RenderStage* renderStage = cv-getRenderStage() ) {
                // Get the render-bin list
                osgUtil::RenderBin::RenderBinList binList = 
 renderStage-getRenderBinList();

                                    osg::notify(osg::ALWAYS)  RENDER BIN 
 LIST SIZE:   binList.size()  std::endl;

                                    // go to renderbin which stores 
 transparent drawables (always number 10 ?)
                                    if( binList.find(10) != binList.end() ) {
                                            // for this render bin, do not 
 render its content
                                            osg::StateSet* binStateSet = 
 binList[10]-getStateSet();

                                            // mask depth buffer
                                            binStateSet-setAttributeAndModes( 
 new osg::Depth(osg::Depth::LESS, 0.0, 1.0, false), osg::StateAttribute::ON | 
 osg::StateAttribute::OVERRIDE );

                                            // mask color buffer
                                            binStateSet-setAttributeAndModes( 
 new osg::ColorMask(false, false, false, false), osg::StateAttribute::ON | 
 osg::StateAttribute::OVERRIDE );

                                            // TO DO: stencil and accum mask
                                    }
                      }
        }
    }
 }





 If I add this custom node as a child of my camera node and the scene itself 
 as a child of my custom node, then no transparent objects are rendered - 
 which is exactly what I want.

 

Re: [osg-users] Rendering transparent/opaque objects separately in deferred renderer using osg::RenderBin - how?

2009-04-27 Thread Jirka
Thank you, Robert, for your advice, I appreciate it.

I'll probably take the cull traversal mask approach, since I don't have much 
spare time and it seems easier to implement. I'll post my results as soon as I 
have them if someone else deals with the same problem.

Regards, Jirka.

--
Read this topic online here:
http://forum.openscenegraph.org/viewtopic.php?p=10899#10899





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


[osg-users] Rendering transparent/opaque objects separately in deferred renderer using osg::RenderBin - how?

2009-04-26 Thread Jirka
Hi,

I work on a deferred renderer for my master thesis. Everything is fine and now 
I want to correctly render transparent objects. I want to use forward rendering 
for that taks - just render the transparent objects in one pass, blend them 
together and add it to buffer of rendered opaque objects (by deferred 
rendering).

The problem is that I don't now how to correctly access opaque/transparent 
objects in my scene graph to render them separately and combine them in the 
final stage of deferred renderer. I have found a disscussion 
http://lists.openscenegraph.org/pipermail/osg-users-openscenegraph.org/2008-July/014769.html
 where access to render bin #10 (which should always contain transparent 
geometry ?) is described. So I got and idea that I could create my custom scene 
graph node (derived from osg::Geode) and redefine its traversal method, where I 
would discard the render bin for transparent/opaque objects after the cull 
traversal. 
I modified the code from the discussion a little bit and I mask depth and color 
buffer for writing when rendering transparent objects (don't know how to 
acctually remove transparent drawables from particular render bin):


Code:

void RenderBinMaskNode::traverse(osg::NodeVisitor nv) {

this-osg::Group::traverse( nv );
 
// Clone render-bin 10 if this is a cull visitor
if ( nv.getVisitorType() == osg::NodeVisitor::CULL_VISITOR ) {

osgUtil::CullVisitor* cv = dynamic_castosgUtil::CullVisitor*( nv );

if ( cv ) {
// Act if we have a RenderStage pointer
if ( osgUtil::RenderStage* renderStage = cv-getRenderStage() ) {   

// Get the render-bin list
osgUtil::RenderBin::RenderBinList binList = 
renderStage-getRenderBinList();   

osg::notify(osg::ALWAYS)  RENDER BIN 
LIST SIZE:   binList.size()  std::endl;

// go to renderbin which stores transparent 
drawables (always number 10 ?)
if( binList.find(10) != binList.end() ) {
// for this render bin, do not 
render its content 
osg::StateSet* binStateSet = 
binList[10]-getStateSet();

// mask depth buffer
binStateSet-setAttributeAndModes( 
new osg::Depth(osg::Depth::LESS, 0.0, 1.0, false), osg::StateAttribute::ON | 
osg::StateAttribute::OVERRIDE );

// mask color buffer
binStateSet-setAttributeAndModes( 
new osg::ColorMask(false, false, false, false), osg::StateAttribute::ON | 
osg::StateAttribute::OVERRIDE );

// TO DO: stencil and accum mask
}
  }
}
}
}





If I add this custom node as a child of my camera node and the scene itself as 
a child of my custom node, then no transparent objects are rendered - which is 
exactly what I want. 

But the trouble is when I want to render only the transparent objects. When I 
dump the size of render bin list (see the code), it is 0 if no transparent 
object should be rendered on the screen (it is outside the view frustum) and 1 
if a transparent object should be rendered (but it is not visible since I mask 
the depth and color buffers). So I have only one render bin containing 
transparent geometry and no render bin with opaque geometry (and even though 
the opaque geometry is rendered correctly). I don't underestand why since as 
far as I know, the cull visitor should fill at least two render bins, one for 
transparent and one for opaque geometry. 

Finally, my questions: Is it correct that I have only one render bin containing 
transparent geometry and no render bin with opaque geometry? How can I render 
only the transparent geometry of my scene (possibly using the approach from the 
code)?

Thank you in advance for _any_ help. I really need to solve this out. PS.: I 
apologize for my poor English.

Regards, Jirka.

--
Read this topic online here:
http://forum.openscenegraph.org/viewtopic.php?p=10874#10874





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