P.S.: I don't pretend to understand any of this. Render bins and render bin details are one of the more confusing parts of OSG... I generally just keep monkeying with them until something sticks.

I will point out that in my understanding, the render bin number and the render bin details are not tightly related like one might think. It's not like there's a fixed array of bins somewhere. As I recall, bin number controls rendering order locally to that part of the scene graph. Render bin details define how to sort/render things within that local bin. So if child 1 is render bin 1 it will be rendered before child 2 at render bin 2. The parent node might be render bin 25 and it's irrelevant. I think.

Though as soon as I pretend I understand that I've had it bite me. So I could be somewhat wrong somewhere.

-Paul

Paul Speed wrote:
Even within the transparent bin you can enforce specific ordering with the bin number. Lower numbers get rendered before higher numbers.

I'd have to dig to find any of my own example code but I hoped perhaps the hint would be enough in short time.

We did this all the time to render double-side transparent geometry. Draw the inner faces in a lower bin number than the outer faces. Even with different bin numbers you can still depth sort them.

We had semi-transparent glass boxes with text on the sides. I think we ultimately had three different bin numbers we used for that associated with the inner, outer, and text geometries.

-Paul

Jason Daly wrote:
Rabbi Robinson wrote:
Hi,

Is there anyway that I can enforce drawing the objects inside first before drawing the outside membrane?

Sure, just use setRenderBinDetails() to set a render bin for the membrane that has a higher number than the render bin used by the interior objects. For the other parameter, you can set either "DefaultBin" for a state-sorted bin, or "DepthSortedBin" for a depth-sorted bin.

interiorStateSet->setRenderBinDetails(0, "DefaultBin");
membraneStateSet->setRenderBinDetails(10, "DepthSortedBin");


However, this is equivalent to this code:

interiorStateSet->setRenderingHint(StateSet::OPAQUE_BIN);
membraneStateSet->setRenderingHint(StateSet::TRANSPARENT_BIN);


Which is probably close to what you're already doing. The problem is that the transparent geometry still has to obey the depth (z-buffer) test, even if it's drawn last. You can try disabling the depth test, but this is likely to cause other problems (if you ever have anything move in front of the membrane, for example):

depth = new Depth();
depth->setFunction(Depth::ALWAYS);
membraneStateSet->setAttributeAndModes(depth, StateAttribute::ON);


This is the main reason why the alpha to coverage method is sometimes used, even though it's a bit expensive in draw time.

--"J"

_______________________________________________
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 list
osg-users@lists.openscenegraph.org
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org

Reply via email to