查看: 971|回复: 3

为什么我的正方形这么"黑"啊? 光照效果非常弱

[复制链接]

该用户从未签到

发表于 2014-2-27 09:51:44 | 显示全部楼层 |阅读模式
就是画一个正方形, 非常简单, 然后照上
Group::getOrCreateStateSet()->setMode( GL_LIGHTING, osg::StateAttribute::ON |osg::StateAttribute::OVERRIDE);

可是,光照效果非常弱, 很黑. 设定了normal, 正方形的一个面完全就看不到, 彻底黑(这是应该的吧); 但是把正方形翻转过来, 不是彻底黑,但是只能看到一点浅浅的灰黑色. (我觉得应该是白花花的颜色啊)

这究竟是为何?

画正方形代码非常简单: 如下:
  1.         osg::ref_ptr<osg::Geode> geode = new osg::Geode;
  2.         osg::ref_ptr<osg::Geometry> geometry = new osg::Geometry;
  3.         osg::ref_ptr<osg::Vec3Array> v = new osg::Vec3Array;
  4.         osg::ref_ptr<osg::LineWidth> linewidth = new osg::LineWidth;

  5.         v->push_back(leftTop);
  6.         v->push_back(rightTop);
  7.         v->push_back(rightBottom);
  8.         v->push_back(leftBottom);

  9.         osg::ref_ptr<osg::Vec4Array> color = new osg::Vec4Array;
  10.         color->push_back(osg::Vec4(1.0,1.0,1.0,1.0));

  11.         osg::ref_ptr<osg::DrawArrays> da = new osg::DrawArrays(GL_QUADS, 0, v->size());

  12.         geometry->setVertexArray(v);
  13.         geometry->addPrimitiveSet(da);
  14.         geometry->setColorArray(color);
  15.         geometry->setColorBinding(osg::Geometry::BIND_OVERALL);

  16.         osg::Vec3Array* quadNormal = new osg::Vec3Array;
  17.         geometry->setNormalArray(quadNormal);
  18.         geometry->setNormalBinding(osg::Geometry::BIND_OVERALL);
  19.         quadNormal->push_back(osg::Vec3(0.f, 1.0f, 0.0f));

  20.         linewidth->setWidth(2.0);

  21.         geode->addDrawable(geometry);
  22.         geometry->getOrCreateStateSet()->setAttributeAndModes(linewidth, osg::StateAttribute::ON);
  23.         geometry->getOrCreateStateSet()->setMode(GL_DEPTH_TEST, osg::StateAttribute::ON);
  24.         geometry->getOrCreateStateSet()->setMode(GL_LINE_SMOOTH, osg::StateAttribute::ON);
  25.         geometry->getOrCreateStateSet()->setRenderBinDetails( 20, "TraversalOrderBin",
  26.                 osg::StateSet::USE_RENDERBIN_DETAILS );
  27.         geometry->getOrCreateStateSet()->setNestRenderBins(true);

  28.         ////////////////////////////////
  29.         geometry->getOrCreateStateSet()->setMode(GL_BLEND,  osg::StateAttribute::OVERRIDE | osg::StateAttribute::OFF);
复制代码

一面是彻底黑色

一面是彻底黑色

另一面(光照面) 颜色深得几乎看不到

另一面(光照面) 颜色深得几乎看不到

该用户从未签到

发表于 2014-2-27 10:44:07 | 显示全部楼层
geometry->getOrCreateStateSet()->setMode(GL_NORMALIZE, osg::StateAttribute::ON | osg::StateAttribute:ROTECTED);

面渲染是单向的,反面肯定是黑色。
正面变黑,根据我的经验一般是GL_NORMALIZE没打开,法向量不实时计算造成的。 这是是有效率问题的,看你什么应用啦

该用户从未签到

发表于 2014-2-27 10:45:04 | 显示全部楼层
不过你这个 很奇怪 我没看出正方形来?

该用户从未签到

 楼主| 发表于 2014-2-27 11:23:37 | 显示全部楼层
本帖最后由 superwavelet 于 2014-3-2 05:57 编辑

多谢 cenfer, 正如您所料, 现在可以了

但是如何使得正面和背面都可以被光照亮呢?

多谢

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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