OpenGL - Lighting (光照) |
来自:86VR | 作者:IceSharK - PP.Poet | 时间:2004-10-10 |
1 简单光照
OpenGL简单光照光源分为:
辐射光(Emitted Light)是最简单的一种光,它直接从物体发出并且不受任何光源影响。
1.1 创建光源
光源有许多特性,如颜色、位置、方向等。
设置光源特性参数的函数:
void glLight{if}[v]( GLenum light , GLenum pname , TYPE param )
参数light指定所创建的光源号,如 GL_LIGHT0 ,GL_LIGHT1 ,GL_LIGHT2 ... ...
注:只有 GL_LIGHT0 的 GL_DIFFUSE 和 GL_SPECULAR 的缺省值为 ( 1.0 ,1.0 ,1.0 ,1.0 )
1.2 启动光照
glEnable( GL_LIGHTING ); // 启用光照
1.3 简单光照 - 示例
程序截图
源码下载
1.3.1 简单光照 - 多光源 - 示例
程序截图
源码下载
2 光照模型
OpenGL光照模型由以下三部分组成:
2.1 全局环境光
2.1 全局环境光
每个光源都能对场景提供环境光。
设置全局环境光:
float Light_Model_Ambient[] = { 0.2 , 0.2 , 0.2 , 1.0 }; // 缺省值
glLightModelfv( GL_LIGHT_MODEL_AMBIENT , Light_Model_Ambient );
Light_Model_Ambient参数值指定了整个场景中的环境RGBA浓度。
2.1.1 全局环境光 - 示例
程序截图
源码下载
2.2 局部视点和无穷远视点 视点位置能影响镜面反射中高光的计算。
2.3 双面光照
光照计算是对所有多边形(包括其正面和背面)进行的。
glLightModeli( LIGHT_MODEL_TWO_SIDE , GL_TRUE ); // 启用双面光照
2.3.1 双面光照 - 示例
绘制一个没有底面的圆锥,这样就可以看见圆锥内部。
程序截图
未启用双面光照,看不见圆锥内部,看到圆锥的底面为绿色,这是由环境光造成的。
启用双面光照后,就可以看见圆锥内部了。
源码下载
3 光源衰减
衰减系数 = 1 / ( Kc + Kl*d + Kq*d*d )
d = 光源位置到物体顶点的距离
缺省时,衰减因子为( 1 , 0 , 0 ) 即不进行衰减
环境光、漫反射光和镜面光的强度都衰减,
3.1 光源衰减 - 示例
程序截图
未启用光源衰减
启用光源衰减后
源码下载
CSharp_OpenGL_Lighting_Attenuation.rar
4 聚光
位置光源可以定义成聚光形式,即将光的形状限制在一个圆锥内。
4.1 设置聚光源位置
GLfloat light_position[]={ 1.0 , 1.0 , 1.0 , 1.0 };
4.2 设置聚光最大散布角
聚光最大散布角就是光锥的轴与中心线的夹角,也就是光锥顶角的一半。
glLightf( GL_LIGHT0,GL_SPOT_CUTOFF , 45.0 );
4.3 设置聚光方向
聚光方向决定光锥的轴,缺省值为( 0.0 , 0.0 , -1.0 ) , 即指向负Z轴。
GLfloat spot_direction[]={ -1.0 , -1.0 , 0.0 };
4.4 设置聚光指数
聚光指数控制光的集中程度,光锥中心的光强最大,越靠边的光强越小。
glLightf( GL_LIGHT0 , GL_SPOT_EXPONENT , 2.0 );
4.5 聚光 - 示例
程序截图
源码下载
CSharp_OpenGL_Lighting_Spot.rar
5 辐射光 通过GL_EMISSION定义一个RGBA值,使物体看起来象发出这种颜色的光一样。
0GLfloat mat_emission[]={ 0.1 , 0.2 , 0.3, 1.0 };
5.1 辐射光 - 示例
程序截图
源码下载
CSharp_OpenGL_Lighting_Emission.rar
6 控制光源位置
光源的位置也可以通过变换矩阵,调整光源函数和视点变换函数来获得三种不同的效果:
1.光源位置保持固定
6.1 物体旋转 光源平移 - 示例
程序截图
|