您的位置:首页 > 其它

[osg]源码分析:osg::Light

2013-06-14 16:56 148 查看
一、分析OpenGL中的光源

OpenGL中有两种光源:一般光源和全局环境光(背景光)。这两种光源的设置方法是不同的。

1. 一般光源

使用glLight设置;

2. 全局环境光(不在此详论,见osg::LightMode)

使用glLightMode设置。

void glLight(GLenum light, GLenum pname, TYPE param);

light指定对哪个淘汰操作,可以是 GL_LIGHT0, GL_LIGHT1, …, GL_LIGHT7

pname指定对哪个属性操作:

GL_AMBIENT, GL_DIFFUSE, GL_SPECULAR, GL_POSITION,

GL_SPOT_DIRECTION(聚光灯的方向)

GL_SPOT_EXPONENT(聚光的程序,param越大,聚的越狠)

GL_SPOT_CUTOFF(光源发射光线覆盖的角度的一半,为0-90度,也可以是180度这个特殊值,表示无聚光)

GL_CONSTANT_ATTENUATION,GL_LINEAR_ATTENUATION, GL_QUADRATIC_ATTENUATION表示三种衰减。

光强度随着离光源距离的增加而减小。

二、osg::Light在osg::LIght::Init中初始化了光源的一些属性

_lightnum = 0;
_ambient.set(0.05f,0.05f,0.05f,1.0f);
_diffuse.set(0.8f,0.8f,0.8f,1.0f);
_specular.set(0.05f,0.05f,0.05f,1.0f);
_position.set(0.0f,0.0f,1.0f,0.0f);
_direction.set(0.0f,0.0f,-1.0f);
_spot_exponent = 0.0f;
_spot_cutoff = 180.0f;
_constant_attenuation = 1.0f;
_linear_attenuation = 0.0f;
_quadratic_attenuation = 0.0f;


当然这些属性可以使用Set/Get管理。

三、最终在apply中将光照属性设上去。
glLightfv( (GLenum)((int)GL_LIGHT0 + _lightnum), GL_AMBIENT,               _ambient.ptr() );
glLightfv( (GLenum)((int)GL_LIGHT0 + _lightnum), GL_DIFFUSE,               _diffuse.ptr() );
glLightfv( (GLenum)((int)GL_LIGHT0 + _lightnum), GL_SPECULAR,              _specular.ptr() );
glLightfv( (GLenum)((int)GL_LIGHT0 + _lightnum), GL_POSITION,              _position.ptr() );
glLightfv( (GLenum)((int)GL_LIGHT0 + _lightnum), GL_SPOT_DIRECTION,        _direction.ptr() );
glLightf ( (GLenum)((int)GL_LIGHT0 + _lightnum), GL_SPOT_EXPONENT,         _spot_exponent );
glLightf ( (GLenum)((int)GL_LIGHT0 + _lightnum), GL_SPOT_CUTOFF,           _spot_cutoff );
glLightf ( (GLenum)((int)GL_LIGHT0 + _lightnum), GL_CONSTANT_ATTENUATION,  _constant_attenuation );
glLightf ( (GLenum)((int)GL_LIGHT0 + _lightnum), GL_LINEAR_ATTENUATION,    _linear_attenuation );
glLightf ( (GLenum)((int)GL_LIGHT0 + _lightnum), GL_QUADRATIC_ATTENUATION, _quadratic_attenuat


成员变量lightnum表示此为第几个光源,OpenGL中一个光源封装为一个osg::Light。

四、最终我们看到的颜色是光照+材料属性共同决定的。(参见osg::Material)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: