[osg-users] Problem setting a skydome
aluaces at udc.es
Thu Jul 17 03:52:19 PDT 2008
El Miércoles 16 Julio 2008ES 21:41:49 David Spilling escribió:
> I presume that your skydome has some sort of camera centred transform over
> it (as per osghangglide's example use); your code doesn't show it.
I haven't coded it yet, I wanted to have the near/far issue fixed first.
> > osg::ClearNode* clearNode = new osg::ClearNode;
> > clearNode->setRequiresClear(false);
> This is odd. If your camera is the first thing to draw (implied by
> PRE_RENDER) then something needs to be clearing the colour and depth
> buffer. In any case, you can use camera's setClearMask method to control
> this without needing a clearNode. For example
> camera->setClearMask(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT) clears
> everyhing, setClearMask(0) clears nothing.
Yes, you are right.
> osg::TexEnv* te = new osg::TexEnv;
> > te->setMode(osg::TexEnv::REPLACE);
> > stateset->setTextureAttributeAndModes(0, te, osg::StateAttribute::ON);
> Slightly surprised to see this, but if your skydome needs it, then OK.
Well, I wanted to display texture real colour, not modified by any lighting
> > stateset->setMode( GL_CULL_FACE, osg::StateAttribute::ON );
> > osg::Depth* depth = new osg::Depth;
> > depth->setFunction(osg::Depth::ALWAYS);
> > depth->setRange(1.0,1.0);
> > stateset->setAttributeAndModes(depth, osg::StateAttribute::ON );
> Again, not wrong (as the depth testing is always passed) but not really
> necessary, as you are ensuring that your skydome is drawn first. I would
> tend to prevent depth writing with
> osg::Depth* depth = new osg::Depth;
> depth->setWriteMask(false); // don't bother writing the depth buffer
> stateset->setAttributeAndModes(depth, osg::StateAttribute::ON );
> and also disable depth testing with
> stateSet->setMode(GL_DEPTH_TEST, osg::StateAttribute::OFF)
Yes, I have deleted that block.
Finally and thanks to your valuable help, I have managed to get it working.
Somehow I were mismatching ClearMask with ColorMask when I eliminated the
ClearNode. Now I have the pre-render slave camera, which has its own near/far
planes and then the real scene is rendered over it:
//Paint over the skydome
//Create the pre-render skydome camera
osg::Camera *camara = new osg::Camera;
camera->setClearMask(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
osg::StateSet* stateset = n->getOrCreateStateSet();
osg::TexEnv* te = new osg::TexEnv;
stateset->setTextureAttributeAndModes(0, te, osg::StateAttribute::ON);
stateset->setMode( GL_LIGHTING, osg::StateAttribute::OFF );
stateset->setMode( GL_CULL_FACE, osg::StateAttribute::ON );
Again, thank you very much for your advice :)
More information about the osg-users