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

