|
发表于 2015-7-6 11:54:01
|
显示全部楼层
参考 <OpenSceneGraph 快速入门指导> 2.4.5 81p
法线
只有几何体数据中设有单位长度法线时,才可以实现正确的光照。第 2.2 节
“叶节点( Geode)和几何信息”已经对法线数组的设置和绑定到 Geometry 对象
作了介绍。
在大多数 3D API 中,法线数据必须单位化以得到正确的结果。注意缩放变
换的动作会改变法线的长度。如果你的 Geometry 对象中已经包含了单位长度的
OpenSceneGraph 快速入门指导 81
法线数组,但是光照的计算结果过于明亮或过于暗淡,那么这一现象可能是缩放
变换造成的。最有效的解决方案是在 StateSet 中允许法线的重放缩模式。
osg::StateSet* state = geode->setOrCreateStateSet();
state->setMode( GL_RESCALE_NORMAL, osg::StateAttribute::ON );
与 OpenGL 中相同, 这一特性可以保证法线在均匀放缩变换时仍然保持单位
长度。如果场景中的放缩变换是非均匀的,那么你可以允许法线归一化模式,以
保证法线为单位长度。
osg::StateSet* state = geode->setOrCreateStateSet();
state->setMode( GL_NORMALIZE, osg::StateAttribute::ON );
由于要进行法线的重新放缩,归一化模式往往会耗费大量的时间。编程时要
尽量避免。 |
|