查看: 1332|回复: 4

奇怪的光照问题

[复制链接]

该用户从未签到

发表于 2014-11-24 21:34:53 | 显示全部楼层 |阅读模式
本帖最后由 rubby 于 2014-11-24 22:03 编辑

我的场景图中,包含一个小圆球(记为A) 以及自己利用四边形创建类似圆柱面的几何体,每个顶点进行着色,平滑过渡(记为B)
其中 小圆球,使用osg::sphere 创建,设置为红色
  1. osg::ref_ptr<osg::Sphere> sphere = new osg::Sphere(osg::Vec3(0,0,0), 6.0f);  
  2.                 osg::ref_ptr<osg::ShapeDrawable> shapeDrawable = new osg::ShapeDrawable(sphere.get());  
  3.                 shapeDrawable->setColor(osg::Vec4(0.0f,0.0f,1.0f,1.0f));       
复制代码


场景中使用默认的osg光照,未定义光源。

一、开启光照后,mRoot为场景图的根节点。
  1.         osg::StateSet* state = mRoot->getOrCreateStateSet();                       
  2.                         state->setMode( GL_LIGHT0, osg::StateAttribute::ON|osg::StateAttribute::OVERRIDE |osg::StateAttribute::PROTECTED);
复制代码

如图1

小圆球(记为A)为红色。



二、关闭光照后,
  1. osg::StateSet* state =mRoot->getOrCreateStateSet();
  2.                         state->setMode( GL_LIGHT0, osg::StateAttribute::OFF|osg::StateAttribute::OVERRIDE |osg::StateAttribute::PROTECTED);
复制代码

如图2

小圆球(记为A)为黑色。

但是无论是否开启光照,自己利用四边形创建类似圆柱面的几何体(记为B) 未发生变化
其效果类似将B的 state->setMode( GL_LIGHTING, osg::StateAttribute::OFF)。我使用的是osg3.0.1

后来,我搜索论坛和相关网站,看到有前辈说:

  1. ss->setMode(GL_RESCALE_NORMAL, osg::StateAttribute::ON|osg::StateAttribute::OVERRIDE);
  2.         ss->setMode(GL_NORMALIZE,osg::StateAttribute::ON|osg::StateAttribute::OVERRIDE);
复制代码

加上以上两句话,仍然无效。

此外我也使用了法线自动生成工具。光照仍然对B无效。
  1.                 osgUtil::SmoothingVisitor smv;                //法线自动生成工具
  2.                 smv.smooth(*geom);

  3.                 genode->addDrawable(geom.get());
复制代码




请各路神仙,给小弟一些指点,搞了好多天,都没有找到秘诀。。。。

图2

图2

图1

图1

该用户从未签到

发表于 2014-11-27 12:43:15 | 显示全部楼层
rubby 发表于 2014-11-26 22:17
多谢你,我使用的是传统固定管线渲染,没有用着色器。
就是普通的 设置一个颜色数组,然后绑定到每个顶 ...

我对光照研究也不是很多,有没有可能是B模型没打开光照相关的状态集,或者B模型不是受GL_LIGHT0光源控制的?每个场景有8个光源来着。

该用户从未签到

发表于 2014-11-26 11:24:13 | 显示全部楼层
看你上面说的是B模型是利用着色器实现的着色吧,着色器是指自己写本来由固定管线渲染的内容,无论外部怎么改,着色器没改的话B模型应该是不变的吧。个人理解,建议看下着色器定义

该用户从未签到

 楼主| 发表于 2014-11-26 22:17:18 | 显示全部楼层
shenjidzl 发表于 2014-11-26 11:24
看你上面说的是B模型是利用着色器实现的着色吧,着色器是指自己写本来由固定管线渲染的内容,无论外部怎么 ...

多谢你,我使用的是传统固定管线渲染,没有用着色器。
就是普通的 设置一个颜色数组,然后绑定到每个顶点上。
setColorArray
setColorBinding


一起讨论,共同进步

该用户从未签到

 楼主| 发表于 2015-4-18 14:57:40 | 显示全部楼层
本帖最后由 rubby 于 2015-5-17 21:41 编辑

后来,发现 根本原因还是着色发生了错误。颜色是四位数(a1,a2,a3,a4) a1~a4必须在0~1之间,而不是0~255之间。请大家借鉴。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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