OSG 轮廓仅出现在几何体的一侧
OSG Outline only appears on one side of geometry
我正在尝试在场景中的一段二维几何体周围显示轮廓。轮廓仅出现在几何体的一侧,我希望它出现在两侧。我假设我需要指定一个设置,但作为 OSG 的新手我不知道这可能是什么;我也无法从文档或在线示例中辨别出来。
几何基本上是一个平面,由一堆较小的平面组成,茎从一侧伸出。
// Initialize an outline
osg::ref_ptr<osgFX::Outline> vCellOutline = new osgFX::Outline;
mModel3D->addChild(vCellOutline); // Add it as a child of the grid so it appears in the scene
vCellOutline->setWidth(8); // Set some stuff so it appears
vCellOutline->setColor(osg::Vec4(1, 1, 0, 1));
osg::ref_ptr<osg::StateSet> vOutlineState = vCellOutline->getOrCreateStateSet();
vOutlineState->setMode(GL_LIGHTING, osg::StateAttribute::PROTECTED | osg::StateAttribute::ON);
// Add the cell as a child of the outline
vCellOutline->addChild(vCellGeode);
我试过增加宽度,因为我认为它可能没有显示出来,但这没有什么区别。当相机从 "side on" 视角之外查看几何体时,轮廓消失。
我做了一些谷歌搜索并尝试了各种方法,例如分配 two-sided 光照模型(以防它没有被正确点亮),尝试通过
禁用剔除
vOutlineState->setMode(GL_CULL_FACE, osg::StateAttribute::OFF);
vCellOutline->setCullingActive(false);
但这并没有起到任何作用。当我看到默认情况下 osg Outlines cull their front-facing polys 时,我以为我找到了解决方案,所以我尝试了:
osg::ref_ptr<osg::CullFace> cf = new osg::CullFace;
cf->setMode(osg::CullFace::FRONT);
vOutlineState->setAttributeAndModes(cf, osg::StateAttribute::OFF | osg::StateAttribute::OVERRIDE);
但同样,没有效果。有趣的是,我可以使用这种方法关闭 back-facing 多边形。
这样做有效:
osg::ref_ptr<osg::CullFace> cf = new osg::CullFace;
cf->setMode(osg::CullFace::FRONT);
vOutlineState->setAttributeAndModes(cf, osg::StateAttribute::OFF | osg::StateAttribute::OVERRIDE);
并且:
osg::ref_ptr<osg::PolygonMode> polyMode = new osg::PolygonMode;
polyMode->setMode(osg::PolygonMode::FRONT, osg::PolygonMode::LINE);
vOutlineState->setAttributeAndModes(polyMode, osg::StateAttribute::ON | osg::StateAttribute::OVERRIDE);
我猜是因为前面的东西在大纲中没有明确设置class;只有背面的东西是。
顺便说一句,然后我遇到了一个问题,当从正面直接正面看时,轮廓会消失。我仍然不知道为什么,但我更改了我的 "view head-on" 代码以稍微偏移透视,这足以使轮廓恢复原状。
我正在尝试在场景中的一段二维几何体周围显示轮廓。轮廓仅出现在几何体的一侧,我希望它出现在两侧。我假设我需要指定一个设置,但作为 OSG 的新手我不知道这可能是什么;我也无法从文档或在线示例中辨别出来。
几何基本上是一个平面,由一堆较小的平面组成,茎从一侧伸出。
// Initialize an outline
osg::ref_ptr<osgFX::Outline> vCellOutline = new osgFX::Outline;
mModel3D->addChild(vCellOutline); // Add it as a child of the grid so it appears in the scene
vCellOutline->setWidth(8); // Set some stuff so it appears
vCellOutline->setColor(osg::Vec4(1, 1, 0, 1));
osg::ref_ptr<osg::StateSet> vOutlineState = vCellOutline->getOrCreateStateSet();
vOutlineState->setMode(GL_LIGHTING, osg::StateAttribute::PROTECTED | osg::StateAttribute::ON);
// Add the cell as a child of the outline
vCellOutline->addChild(vCellGeode);
我试过增加宽度,因为我认为它可能没有显示出来,但这没有什么区别。当相机从 "side on" 视角之外查看几何体时,轮廓消失。
我做了一些谷歌搜索并尝试了各种方法,例如分配 two-sided 光照模型(以防它没有被正确点亮),尝试通过
禁用剔除vOutlineState->setMode(GL_CULL_FACE, osg::StateAttribute::OFF);
vCellOutline->setCullingActive(false);
但这并没有起到任何作用。当我看到默认情况下 osg Outlines cull their front-facing polys 时,我以为我找到了解决方案,所以我尝试了:
osg::ref_ptr<osg::CullFace> cf = new osg::CullFace;
cf->setMode(osg::CullFace::FRONT);
vOutlineState->setAttributeAndModes(cf, osg::StateAttribute::OFF | osg::StateAttribute::OVERRIDE);
但同样,没有效果。有趣的是,我可以使用这种方法关闭 back-facing 多边形。
这样做有效:
osg::ref_ptr<osg::CullFace> cf = new osg::CullFace;
cf->setMode(osg::CullFace::FRONT);
vOutlineState->setAttributeAndModes(cf, osg::StateAttribute::OFF | osg::StateAttribute::OVERRIDE);
并且:
osg::ref_ptr<osg::PolygonMode> polyMode = new osg::PolygonMode;
polyMode->setMode(osg::PolygonMode::FRONT, osg::PolygonMode::LINE);
vOutlineState->setAttributeAndModes(polyMode, osg::StateAttribute::ON | osg::StateAttribute::OVERRIDE);
我猜是因为前面的东西在大纲中没有明确设置class;只有背面的东西是。
顺便说一句,然后我遇到了一个问题,当从正面直接正面看时,轮廓会消失。我仍然不知道为什么,但我更改了我的 "view head-on" 代码以稍微偏移透视,这足以使轮廓恢复原状。