对应绘制面的时候,有法向设置,默认情况下当你正对着这个面的时候,这个面很亮,光照的反射效果很好,但是如果这个面没有正对着你,那么这个面就会比较暗。为了使没有正对着你的时候,这个面也不是很暗,我这里的解决办法是添加多个光源(还可以自己写GLSL计算漫反射来解决)
(下一篇文章给出了正确的解决办法,设置默认光源)。
光源位置是上下前后左右各一个。光源参数为默认参数,要设置其光源序号和光源朝向。
获取光源代码参考王锐:
osg::Node* createLightSource( unsigned int num, const osg::Vec3d& trans,
const osg::Vec3d &vecDir )
{
osg::ref_ptr<osg::Light> light = new osg::Light;
light->setLightNum( num );
light->setDirection(vecDir);
//light->setAmbient(osg::Vec4(0.0f,0.0f,0.0f,1.0f));
//设置散射光的颜色
//light->setDiffuse(osg::Vec4(0.8f,0.8f,0.8f,1.0f));
//
//light->setSpecular(osg::Vec4(1.0f,1.0f,1.0f,1.0f));
//light->setPosition( osg::Vec4(0.0f, 0.0f, 0.0f, 1.0f) );
osg::ref_ptr<osg::LightSource> lightSource = new osg::LightSource;
lightSource->setLight( light );
osg::ref_ptr<osg::MatrixTransform> sourceTrans = new osg::MatrixTransform;
sourceTrans->setMatrix( osg::Matrix::translate(trans) );
sourceTrans->addChild( lightSource.get() );
return sourceTrans.release();
}
<span style="white-space:pre"> </span>//开启光照
osg::ref_ptr<osg::StateSet> stateset = _root->getOrCreateStateSet();
stateset->setMode(GL_LIGHTING,osg::StateAttribute::ON);
stateset->setMode(GL_LIGHT6,osg::StateAttribute::ON); // GL_LIGHT0是默认光源
// 设置6个光源 解决光照问题
osg::Vec3d ptLight;
osg::Vec3d ptCenter = osg::Vec3d(0,0,0);
double dDis = 200000.0;
{
ptLight = ptCenter + osg::Z_AXIS * dDis;
osg::Node *pNodeLight = createLightSource(6, ptLight, -osg::Z_AXIS);
pNodeLight->setName("light0");
_root->addChild(pNodeLight);
}
设置光源: