1 概述
OSG全面支持OpenGL的光照特性,包括材质属性(material property)、光照属性(light property) 和光照模型(lighting model)。与OpenGL相似,OSG中的光源也是不可见的,而非渲染一个灯泡或其他自然形状。同样,光源会创建着色效果,但并不创建阴影,osgShadow 可以用来创建阴影。
2 osg::Light类
OSG将OpenGL中的glLightO作了一个light状态的类封装,用于保存灯光的模式与属性参数信息。osg:Light类派生自 osg::StateAttribute类,继承了对模式与属性参数信息的操作接口。在osg:light类中 通过apply(State& state)函数将灯光的状态参数信息应用到OpenGL的状态机中。
osg::Light的继承关系图如下图所示。
osg::Light类包括的属性参数如下:
int _lightnum;//灯光数量
vec4 _ambient; //环境光颜色
Vec4 _diffuse; //漫射光颜色
vec4 _specular; //镜面光颜色
vec4 _position; //光源的位置信息
vec3 _direction;//光源的方向
float _constant_attenuation;//常量衰减
float _linear_attenuation; //线性衰减
float _quadratic_attenuation;//二次方衰减
float _spot_exponent;//指数衰减
float _spot_cutoff,//关闭衰减(spread)
上面的参数应该都比较容易理解。OSG支持最多8个光源,即GL_LIGHTO~GL_LIGHT7,这与读者的OpenGL版本也有关系。
3 osg::LightSource类
osg::LightSource 类直接继承自 osg::Group。作为一个灯光管理类,继承了osg::Group类的管理节 点的接口;将灯光作为一个节点可以加入到场景图中进行渲染。
继承关系图如下图所示。
osg::LightSource类中的成员函数为:
void setReferenceFrame(ReferenceFrame rf) //设置顿引用
帧引用包括如下两个枚举变量:
enum ReferenceFrame
{
RELATIVE_RF, //相对帧引用
ABSOLUTE_RF //绝对帧引用
};
设置光源的引用帧时,不是相对于父节点的帧引用,就是相对于绝对坐标的帧,默认的设置为RELATIVE_RF,设置帧引用为RELATIVE_RF同样会设置CullingActive的标志量为开(ON)状态,并且对它的父节点也起作用;否则,对它与它所有的父节点都禁用拣选(Culling),对防止不合适的拣选是必需的,如果绝对光源在场景图的深处将会对拣选的时间有影响,因此,推荐在场景的顶部使用绝对的光源。