osg 学习 之十五:阴影和光照

来源:互联网 发布:nginx tomcat https 编辑:程序博客网 时间:2024/05/01 00:02

需要加阴影和光照,才能产生阴影效果

1. 如何加阴影


 //加阴影
osg::ref_ptr<osgShadow::SoftShadowMap > ssm = new osgShadow::SoftShadowMap;
// ssm->setAmbientBias(osg::Vec2(0.7,0.7));//0.5,0.5
float bias = ssm->getBias();
ssm->setBias(bias*2.0);


osg::ref_ptr<osgShadow::ShadowedScene> ss = new osgShadow::ShadowedScene();
ss->setShadowTechnique(ssm);

ss->setReceivesShadowTraversalMask(0x01);
ss->setCastsShadowTraversalMask(0x02);
_buildings->setNodeMask(0x02);
_landNode->setNodeMask(0x01);
ss->addChild(_landNode);
ss->addChild(_buildings);


2. 如何加光照

 osg::ref_ptr<osg::LightSource> ls = new osg::LightSource();
osg::ref_ptr< osg::Light> lt  = new osg::Light;
lt->setLightNum(0);
lt->setPosition(osg::Vec4(1.0,1.0,1.0,0));
lt->setAmbient(osg::Vec4(0.5,0.5,0.5,1.0));
lt->setDiffuse(osg::Vec4(1.0,1.0,1.0,1.0));
ls->setLight(lt);

         root->addChild(ls);


3. 注意

对一个root,加几个LightSource,每个LightSource中的light的Num不是单独的,需要所有的一起排序,并且设置root的state

osg::StateSet * rootState = root->getOrCreateStateSet();
rootState->setMode(GL_LIGHTING,osg::StateAttribute::ON); 
rootState->setMode(GL_LIGHT0,osg::StateAttribute::ON); 
rootState->setMode(GL_LIGHT1,osg::StateAttribute::ON); 

1个lightsource中2个light
2个lightsource各1个light

渲染效果不一样

建议用1个lightsouce2个light,更真实一些




原创粉丝点击