|
本帖最后由 rubby 于 2014-11-24 22:03 编辑
我的场景图中,包含一个小圆球(记为A) 以及自己利用四边形创建类似圆柱面的几何体,每个顶点进行着色,平滑过渡(记为B)
其中 小圆球,使用osg::sphere 创建,设置为红色
- osg::ref_ptr<osg::Sphere> sphere = new osg::Sphere(osg::Vec3(0,0,0), 6.0f);
- osg::ref_ptr<osg::ShapeDrawable> shapeDrawable = new osg::ShapeDrawable(sphere.get());
- shapeDrawable->setColor(osg::Vec4(0.0f,0.0f,1.0f,1.0f));
复制代码
场景中使用默认的osg光照,未定义光源。
一、开启光照后,mRoot为场景图的根节点。
- osg::StateSet* state = mRoot->getOrCreateStateSet();
- state->setMode( GL_LIGHT0, osg::StateAttribute::ON|osg::StateAttribute::OVERRIDE |osg::StateAttribute::PROTECTED);
复制代码
如图1
小圆球(记为A)为红色。
二、关闭光照后,
- osg::StateSet* state =mRoot->getOrCreateStateSet();
- 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
后来,我搜索论坛和相关网站,看到有前辈说:
- ss->setMode(GL_RESCALE_NORMAL, osg::StateAttribute::ON|osg::StateAttribute::OVERRIDE);
- ss->setMode(GL_NORMALIZE,osg::StateAttribute::ON|osg::StateAttribute::OVERRIDE);
复制代码
加上以上两句话,仍然无效。
此外我也使用了法线自动生成工具。光照仍然对B无效。
- osgUtil::SmoothingVisitor smv; //法线自动生成工具
- smv.smooth(*geom);
- genode->addDrawable(geom.get());
复制代码
请各路神仙,给小弟一些指点,搞了好多天,都没有找到秘诀。。。。 |
-
图2
-
图1
|