对应绘制面的时候,有法向设置,默认情况下当你正对着这个面的时候,这个面很亮,光照的反射效果很好,但是如果这个面没有正对着你,那么这个面就会比较暗。为了使没有正对着你的时候,这个面也不是很暗,我这里的解决办法是添加多个光源(还可以自己写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( () );lease();
}
<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);}
本文发布于:2024-02-03 09:18:20,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170692680650103.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |