查看: 8957|回复: 5

怎样关闭OSG中的缺省光照

[复制链接]

该用户从未签到

发表于 2010-6-30 11:30:51 | 显示全部楼层 |阅读模式
我希望关闭OSG中的缺省光源,包括全局环境光,从而完全自己控制场景光源。关闭缺省光源的代码如下:
  1. _viewer->setLightingMode(osg::View::NO_LIGHT);
  2. osg::StateSet* globalStateset = _viewer->getCamera()->getStateSet();
  3. if (globalStateset)
  4. globalStateset->removeAttribute(osg::StateAttribute::LIGHTMODEL);
复制代码

然后对场景根节点打开光照计算:
  1. _root->getOrCreateStateSet()->setMode(GL_LIGHTING, osg::StateAttribute::ON);
复制代码

这样,理论上此时场景中应该没有任何光源(包括LightModel提供的全局环境光),因此渲染出来的场景应该是完全是黑色(不考虑背景色,模型没有emission)。
然而,我得到的场景渲染结果如下截图,并不是完全的黑色,似乎还有一个全局环境光存在。
1.PNG

请问,我的问题出在哪里?

该用户从未签到

发表于 2010-6-30 13:01:02 | 显示全部楼层
这样可能并不是完全关闭光照,我想您可以这样来做:
setMode(GL_LIGHTING, OFF|OVERRIDE)
setMode(GL_LIGHT0, OFF|OVERRIDE)
然后看一看效果

该用户从未签到

 楼主| 发表于 2010-6-30 13:42:17 | 显示全部楼层
本帖最后由 indif 于 2010-6-30 13:47 编辑

确切的说,我的目的不是关闭光照,而是关闭OSG中缺省的光源。
光照计算(GL_LIGHTING)是需要的

我所奇怪的是,除了setLinghingMode里创建的光源,以及一个全局的LightModel提供的全局环境光以外,还有什么缺省光源在起作用吗?为什么把光源都去掉了后场景还会被照亮?

该用户从未签到

 楼主| 发表于 2010-6-30 13:43:38 | 显示全部楼层
2# array
这样是关闭了光照计算,得到的渲染结果是无光照的模型(顶点和贴图颜色)

该用户从未签到

发表于 2010-6-30 15:09:06 | 显示全部楼层
那您不妨自己设置一个缺省的全黑色的光源,直接使用LightSource指定一个新的0号光源就可以了。您目前的作法的确保证OSG不再使用自定义的缺省光源,但是OpenGL应该还是有缺省光照的

该用户从未签到

 楼主| 发表于 2010-6-30 16:00:19 | 显示全部楼层
试了试,发现应该是LightModel的问题,
  1. globalStateset->removeAttribute(osg::StateAttribute::LIGHTMODEL);
复制代码
改成
  1. osg::LightModel* lightModel = new osg::LightModel;
  2.         lightModel->setAmbientIntensity(osg::Vec4(0,0,0,0));
  3.         globalStateset->setAttributeAndModes(lightModel, osg::StateAttribute::ON);
复制代码
后,缺省的光源完全被屏蔽
查了下,GL_LIGHT_MODEL_AMBIENT的缺省值是0.2,0.2,0.2,1
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表