Hi Judie,

What I noticed using colormask is, if you want some "invisible" objects 
(with a colormask to false) to occlude some other objects you must add 
the "invisible " ones before the others in the scenegraph. When I say 
before it is from the scenegraph traversal point of view.

I don't know if it can help you...

Frédéric.







Judie a écrit :
> Hi Robert,
>
> I am sorry for not providing an adequate description.
>
> High level explanation of what I am trying to do:
>
> Replace some of the geometry in the scene with live camera feed. But
> in order to do this, I still need the actual geometry in the scene to
> modify the depth buffer as if it were there even though it is not
> visible.
>
> The initial set up for the render states of the scene is:
>
> osgUtil::CullVisitor *pCullVisitor = m_sceneView->getCullVisitor();
>
> osgUtil::RenderBin *pRenderBin = pCullVisitor->getCurrentRenderBin();
>
> pRenderBin->setSortMode(osgUtil::RenderBin::SORT_BACK_TO_FRONT);
>
> osg::StateSet *pStateSet = m_sceneView->getGlobalStateSet();
>
> pStateSet->setMode(GL_ALPHA_TEST,osg::StateAttribute::OFF);
>
> osg::CullFace *pCullFace = new osg::CullFace;
>
> pCullFace->setMode(osg::CullFace::BACK);
>
> pStateSet->setMode(GL_CULL_FACE, osg::StateAttribute::ON);
>
> pStateSet->setAttribute(pCullFace, osg::StateAttribute::ON);
>
> osg::ShadeModel *pShadeMdl = new osg::ShadeModel;
>
> pShadeMdl->setMode(osg::ShadeModel::FLAT);
>
> pStateSet->setAttribute(pShadeMdl, osg::StateAttribute::ON);
>
> osg::Depth *pDepth = new osg::Depth;
>
> pDepth->setFunction(osg::Depth::LEQUAL);
>
> pStateSet->setMode(GL_DEPTH_TEST, osg::StateAttribute::ON);
>
> pStateSet->setAttribute(pDepth, osg::StateAttribute::ON);
>
>
> All I do to make some of the geometry not visible and yet still drawn
> to the depth buffer, is disable writes to the color buffer:
>
> osg::ColorMask *colormaskOff = new osg::ColorMask(false, false, false,
> false);
>
> osg::StateSet* state = node->getOrCreateStateSet();
>
> state->setAttribute(colormaskOff);
>
> At another point in the scene graph, I enable writes to the color
> buffer using the same method except the ColorMask values are all true.
> I never disable depth testing.
>
> When the scene is rendered, I see my video background and I see my
> objects that should be visible. However, the depth buffer testing does
> not seem to work correctly because some parts of the visible geometry
> that should be occluded by the invisible geometry are showing. But
> this is not uniform. There are times when the visible geometry is
> occluded by the invisible geometry as it should be.
>
> If I change the sorting to this:
>
> pRenderBin->setSortMode(osgUtil::RenderBin::SORT_FRONT_TO_BACK);
>
> then it appears to work until I rotate the camera and then there are
> angles which seem to break the depth testing.
>
> What doesn't make sense to me is why the behavior should change at all
> just by disabling writes to the color buffer? I have done the same
> with OpenGL code in a different application, where I was not sorting
> (because there was no transparency) and just relying on the graphics
> drivers\hardware to do the Z buffering, and the occlusion of the
> inivisible objects worked fine. So it seems there must be some
> "optimization" taking place inside the scene graph that is culling
> objects or something. I don't know. It just doesn't make sense to me
> why I can do something in OpenGL and not with OSG.
>
> What do you think?
>
> Thanks,
>
> Judie
>
>
>
>
>
>
>
>
> On Apr 16, 1:57 am, "Robert Osfield" <[EMAIL PROTECTED]> wrote:
>   
>> Hi Judie,
>>
>> I'm afraid I've just found it too difficult to work out what you are
>> doing to be able to provide any suggestions.  Could you provide a high
>> level explanation of what you are trying to do and why to give a bit
>> of context.  Then why you provide code snippets could you space them
>> better as word wrap has made it extremely difficult to read the code.
>>
>> Robert.
>>
>>
>>
>>
>>
>> On Tue, Apr 15, 2008 at 11:09 PM, Judie <[EMAIL PROTECTED]> wrote:
>>     
>>> In my code I have an OSG tree with the following global state
>>>  attributes defined:
>>>       
>>>                osgUtil::CullVisitor *pCullVisitor = m_sceneView-
>>>  >getCullVisitor();
>>>         osgUtil::RenderBin *pRenderBin = 
>>> pCullVisitor->getCurrentRenderBin();
>>>         pRenderBin->setSortMode(osgUtil::RenderBin::SORT_BACK_TO_FRONT);
>>>                 osg::StateSet *pStateSet = m_sceneView-
>>>  >getGlobalStateSet();
>>>                 pStateSet->setMode(GL_ALPHA_TEST,
>>>  osg::StateAttribute::OFF);
>>>                osg::CullFace *pCullFace = new osg::CullFace;
>>>         pCullFace->setMode(osg::CullFace::BACK);
>>>         pStateSet->setMode(GL_CULL_FACE, osg::StateAttribute::ON);
>>>         pStateSet->setAttribute(pCullFace, osg::StateAttribute::ON);
>>>                 osg::ShadeModel *pShadeMdl = new osg::ShadeModel;
>>>         pShadeMdl->setMode(osg::ShadeModel::FLAT);
>>>         pStateSet->setAttribute(pShadeMdl, osg::StateAttribute::ON);
>>>                 osg::Depth *pDepth = new osg::Depth;
>>>         pDepth->setFunction(osg::Depth::LEQUAL);
>>>         pStateSet->setMode(GL_DEPTH_TEST, osg::StateAttribute::ON);
>>>         pStateSet->setAttribute(pDepth, osg::StateAttribute::ON);
>>>       
>>>  The only other time I change the state is when I enable and disable
>>>  the color buffer writes.
>>>       
>>>  Here is what I am seeing:
>>>  If I render the scene with the color buffer always on, then objects
>>>  that should be occluded by other objects behave correctly and are
>>>  occluded.
>>>       
>>>  When I render the scene with the color buffer off for some of the
>>>  nodes in the beginning of the tree, with it enabled again for ones
>>>  later on, I expect that because I DID NOT disable writes to the depth
>>>  buffer, that the objects which are occluded by other objects (even
>>>  though they were not drawn to the color buffer) should behave
>>>  correctly. However, they do not. Some do and some don't and if I
>>>  rotate then even ones that behave correctly, begin to misbehave.
>>>       
>>>  Now I have made the following change because I don't need to worry
>>>  about transparency anymore:
>>>  pRenderBin->setSortMode(osgUtil::RenderBin::SORT_FRONT_TO_BACK);
>>>       
>>>  And this almost fixes the issue except if I rotate to some degree, I
>>>  still get parts of objects drawn that should be occluded. I know
>>>  because I can toggle the objects visible and invisible.
>>>       
>>>  Is there something internally that can be culling parts of objects
>>>  because I have the color buffer masked for them?
>>>       
>>>  Thanks,
>>>       
>>>  Judie
>>>  _______________________________________________
>>>  osg-users mailing list
>>>  [EMAIL PROTECTED]
>>>  http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph...
>>>       
>> _______________________________________________
>> osg-users mailing list
>> [EMAIL 
>> PROTECTED]://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph...-
>>  Hide quoted text -
>>
>> - Show quoted text -
>>     
> _______________________________________________
> osg-users mailing list
> [email protected]
> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
>   

_______________________________________________
osg-users mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org

Reply via email to