[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中初始化了光源的一些属性
当然这些属性可以使用Set/Get管理。
三、最终在apply中将光照属性设上去。
成员变量lightnum表示此为第几个光源,OpenGL中一个光源封装为一个osg::Light。
四、最终我们看到的颜色是光照+材料属性共同决定的。(参见osg::Material)
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)
相关文章推荐
- [osg]源码分析:osg::LightModel
- MVVMLight源码分析之消息机制和ViewModelBase
- [osg]源码分析:osg::StateSet
- [osg]源码分析:OSG中的智能指针osg::ref_ptr
- 【C++】Android (Light)RefBase-sp-wp引用计数-智能指针源码分析
- [osg]源码分析:osg::Material
- [osg]源码分析:OSG中的智能指针osg::ref_ptr
- [osg]源码分析:osg::Vec3, osg::Vec3f
- [osg]源码分析:osg::Material
- lighttpd高性能Web服务器源码分析?坑爹啊,原来是light httpd!-0 -
- [osg]源码分析:osg::Referenced
- [osg]源码分析:OSG中的智能指针osg::ref_ptr
- osg学习 osg源码分析-最长的一帧 第五日
- [OSG]源码分析:osg::Drawable可绘制对象
- Netfilter源码分析(1)(ZT)
- NGUI 源码分析- UIWidgetInspector
- 分布式文件系统 fastdfs 源码分析 之 文件上传流程分析
- java.security.SecureRandom源码分析
- SDK源码分析 12
- DPDK_API_rte_malloc源码分析