OSG光照使用及模型发暗解决方法

原理部分不细说,这里 主要说一下如何使用光源,以及遇到场景中的模型较暗该如何解决。

一、场景中使用光源步骤:

1、指定模型场景的发现;

2、允许光照并设置光照状态;

3、指定光源属性并关联到场景图形。

#include <osgViewer/Viewer>
#include <osg/Node>
#include <osg/Geode>
#include <osg/Geometry>
#include <osg/Group>
#include <osg/Camera>
#include <osg/Light>
#include <osg/LightSource>
#include <osg/BoundingSphere>
#include <osg/BoundingBox>
 
#include <osgDB/ReadFile>
 
//向场景中添加光源
osg::ref_ptr<osg::Group> createLight(osg::ref_ptr<osg::Node> node)
{
	osg::ref_ptr<osg::Group> lightRoot = new osg::Group();
	lightRoot->addChild(node);
          
        //开启光照
	lightRoot->getOrCreateStateSet()->setMode(GL_LIGHTING, osg::StateAttribute::ON);
	lightRoot->getOrCreateStateSet()->setMode(GL_LIGHT0, osg::StateAttribute::ON);
 
	//计算包围盒
	osg::BoundingSphere bs;
	node->computeBound();
	bs = node->getBound();
 
	//创建一个Light对象
	osg::ref_ptr<osg::Light> light = new osg::Light();
	light->setLightNum(0);
	//设置方向
	light->setDirection(osg::Vec3(0.0f, 0.0f, -1.0f));
	//设置位置
	light->setPosition(osg::Vec4(bs.center().x(), bs.center().y(), bs.center().z() + bs.radius(), 1.0f));
	//设置环境光的颜色
	light->setAmbient(osg::Vec4(1.0f, 1.0f, 1.0f, 1.0f));
	//设置散射光颜色
	light->setDiffuse(osg::Vec4(1.0f, 1.0f, 1.0f, 1.0f));
 
	//设置恒衰减指数
	light->setConstantAttenuation(1.0f);
    //设置线形衰减指数
	light->setLinearAttenuation(0.0f);
	//设置二次方衰减指数
	light->setQuadraticAttenuation(0.0f);
 
	//创建光源
	osg::ref_ptr<osg::LightSource> lightSource = new osg::LightSource();
	lightSource->setLight(light.get());
 
	lightRoot->addChild(lightSource.get());
 
	return lightRoot.get();
}

二、OSG中模型发暗

1、原因

开发过程中有时会遇到加载进去的模型较暗,一般是光照和模型发现设置不正确。因为将模型导入到场景时,由于光照的原因,不在“眼睛”直视的地方,纹理暗淡了。

2、解决方法

(1)osg中光照只会对有法线的模型起作用,而模型经过缩放后法线是不会变得,所以需要手动设置属性,让法线随着模型大小变化而变化。

node->getOrCreateStateSet()->setMode(GL_RESCALE_NORMAL, osg::StateAttribute::ON);

(2)有些时候可能是光照的问题,有个笨办法是直接把模型的光照关闭:

node->getOrCreateStateSet()->setMode(GL_LIGHTING, osg::StateAttribute::OFF| StateAttribute::OVERRIDE);

说明:OSG中StateSet默认是子节点与父节点无关的。在关闭光照的时候,一定要记住将参数设置为OVERRIDE,子节点遵从父节点。


  • 1
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值