osg 添加多光源

对应绘制面的时候,有法向设置,默认情况下当你正对着这个面的时候,这个面很亮,光照的反射效果很好,但是如果这个面没有正对着你,那么这个面就会比较暗。为了使没有正对着你的时候,这个面也不是很暗,我这里的解决办法是添加多个光源(还可以自己写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);
		}

设置光源:



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值