OpenSceneGraph自发光照明

时间:2016-08-01 05:20:35

标签: opengl openscenegraph

我有一个相当大的网格(我用osgDB加载)。它还有几个子网格。

我正在尝试设置发光照明。但是我可以看到(怀疑)只有第一个子网格被点亮了。如何点亮所有子网格是可能的。 我没有使用灯光照亮现场。

推荐的方法是什么?

int main()
{
    osg::Node * cytBuilding = osgDB::readNodeFile( OBJ_FILE );


    osg::Group * root = new osg::Group();
    osg::PositionAttitudeTransform * scenePAT = new osg::PositionAttitudeTransform();
    root->addChild(scenePAT);
    scenePAT->addChild( cytBuilding );




    //material
    osg::Material* material = new osg::Material();
    material->setAmbient(osg::Material::FRONT, osg::Vec4(1.0,1.0f,1.0f,1.0f));
    material->setDiffuse(osg::Material::FRONT, osg::Vec4(1.0,1.0f,1.0f,1.0f));
    material->setSpecular(osg::Material::FRONT, osg::Vec4(0.0,0.0f,0.0f,1.0f));
    material->setEmission(osg::Material::FRONT, osg::Vec4(1.0,1.0f,1.0f,1.0f));
    osg::StateSet* stateset = new osg::StateSet();
    stateset->setAttributeAndModes(material,osg::StateAttribute::OVERRIDE|osg::StateAttribute::ON);
    root->setStateSet(stateset);


    // viewer
    osgViewer::Viewer viewer;

    viewer.setSceneData( root );
    viewer.realize();
    return viewer.run();

当我读取网格(osgDB :: readNodeFile())时,它显示以下错误消息

*** line not handled *** :map_bump
*** line not handled *** :bump
*** line not handled *** :map_opacity
*** line not handled *** :map_d
*** line not handled *** :refl
*** line not handled *** :map_kS
*** line not handled *** :map_Ns

结果显示: enter image description here

当我用meshlab显示时,

相同的网格,我明白了 enter image description here

1 个答案:

答案 0 :(得分:0)

这很大程度上取决于模型中StateSet的组织方式。 您可以尝试在根节点上强制执行照明吗?

stateset->setMode( GL_LIGHTING, osg::StateAttribute::OVERRIDE | osg::StateAttribute::ON );

您还可以尝试实现一个小型访问者来转储模型中的所有材料和状态集,以查看它们的分配方式,也许每个节点都会覆盖OVERRIDE|PROTECTED标记。 仅用于测试,您是否尝试将材质应用于模型中的所有Geodes或Geometries?