OpenGL 复杂光照效果(转)

原创 2007年10月08日 11:49:00
OpenGL - Lighting (光照)
来自:86VR | 作者:IceSharK - PP.Poet | 时间:2004-10-10 
1 简单光照

 

OpenGL简单光照光源分为:

 

辐射光(Emitted Light)是最简单的一种光,它直接从物体发出并且不受任何光源影响。
环境光(Ambient Light)是由光源发出经环境多次散射而无法确定其方向的光,即似乎来自所有方向。
漫射光(Diffuse Light)来自一个方向,它垂直于物体时比倾斜时更明亮。
镜面光(Specular Light)来自特定方向并沿另一方向反射出去。

 

1.1 创建光源

 

光源有许多特性,如颜色、位置、方向等。

 

设置光源特性参数的函数:

 

void glLight{if}[v]( GLenum light , GLenum pname , TYPE param )

 

参数light指定所创建的光源号,如 GL_LIGHT0 ,GL_LIGHT1 ,GL_LIGHT2 ... ...
参数pname指定光源特性
参数param设置相应光源特性值

 

pname 参数名 缺省值 说明
GL_AMBIENT ( 0.0 , 0.0 , 0.0 , 1.0 ) 环境光的颜色
GL_DIFFUSE ( 1.0 , 1.0 , 1.0 , 1.0 ) 漫反射光的颜色
GL_SPECULAR ( 1.0 , 1.0 , 1.0 , 1.0 ) 镜面光的颜色
GL_POSITION ( 0.0 , 0.0 , 1.0 , 0.0 ) 光源位置坐标
GL_SPOT_DIRECTION ( 0.0 , 0.0 , -1.0 ) 点光源聚光方向矢量
GL_SPOT_EXPONENT 0.0 点光源聚光指数
GL_SPOT_CUTOFF 180.0 点光源聚光截止角
GL_CONSTANT_ATTENUATION 1.0 常数衰减因子
GL_LINER_ATTENUATION 0.0 线性衰减因子
GL_QUADRATIC_ATTENUATION 0.0 平方衰减因子

 


注:只有 GL_LIGHT0 的 GL_DIFFUSE 和 GL_SPECULAR 的缺省值为 ( 1.0 ,1.0 ,1.0 ,1.0 )
其他光源的 GL_DIFFUSE 和 GL_SPECULAR 缺省值均为 ( 0.0 ,0.0 ,0.0 ,1.0 )

 


1.2 启动光照

 

glEnable( GL_LIGHTING ); // 启用光照
glEnable( GL_LIGHT0 ); // 启用指定光源

 

1.3 简单光照 - 示例

 

程序截图

 

 


源码下载

 

CSharp_OpenGL_Lighting.rar

 


下载 CsGL 1.4.1 DLL

 

1.3.1 简单光照 - 多光源 - 示例

 

程序截图

 

 


源码下载
CSharp_OpenGL_Lighting_Multiply.rar

 


2 光照模型

 


OpenGL光照模型由以下三部分组成:

 

2.1 全局环境光
2.2 近视点和无穷远视点
2.3 双面光照

 


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浓度。
最大值为1.0,最小值为-1.0。

 

2.1.1 全局环境光 - 示例

 

程序截图

 

 

源码下载
CSharp_OpenGL_Light_Model_Ambient.rar

 

2.2 局部视点和无穷远视点

视点位置能影响镜面反射中高光的计算。
即顶点的高光强度不仅取决于顶点法向量,而且取决于顶点到光源的方向以及顶点到视点的方向。
对于无穷远视点,视点到任何顶点的方向都是相同的。
而对于局部视点,视点到每个顶点的方向是不同的。
所以需要计算视点到每个顶点的方向,因而性能降低了,但效果质量提高了。
缺省时,使用的是无穷远视点。
glLightModeli( GL_LIGHT_MODEL_LOCAL_VIEWER , GL_TRUE ); // 将视点设置为局部视点
glLightModeli( GL_LIGHT_MODEL_LOCAL_VIEWER , GL_FALSE ); // 将视点设置为无穷远视点

 

 

2.3 双面光照

 

光照计算是对所有多边形(包括其正面和背面)进行的。
而一般情况下,只设置正面光照条件,而忽略背面。
但有时候需要看到物体内侧的光照效果,这就需要用到双面光照。

 

glLightModeli( LIGHT_MODEL_TWO_SIDE , GL_TRUE ); // 启用双面光照
glLightModeli( LIGHT_MODEL_TWO_SIDE , GL_FALSE ); // 禁用双面光照

 

2.3.1 双面光照 - 示例

 

绘制一个没有底面的圆锥,这样就可以看见圆锥内部。

 

程序截图

 

未启用双面光照,看不见圆锥内部,看到圆锥的底面为绿色,这是由环境光造成的。

 


 

启用双面光照后,就可以看见圆锥内部了。

 

 

源码下载
CSharp_OpenGL_Light_Model_Two_Side.rar

 


3 光源衰减
真实的光,离光源越远则光强越小。
而方向光源是无穷远光源,因此距离对光强没有影响,所以方向光没有衰减,但位置光则有衰减。
OpenGL是通过光源光强乘以衰减系数来计算衰减光照的。

 

衰减系数 = 1 / ( Kc + Kl*d + Kq*d*d )

 

d = 光源位置到物体顶点的距离
Kc = GL_CONSTANT_ATTENUATION 常数衰减因子
Kl = GL_LINER_ATTENUATION 线性衰减因子
Kq = GL_QUADRATIC_ATTENUATION 二次衰减因子

 

缺省时,衰减因子为( 1 , 0 , 0 ) 即不进行衰减
glLightf( GL_LIGHT0 , GL_CONSTANT_ATTENUATION , 1.0 );
glLightf( GL_LIGHT0 , GL_LINEAR_ATTENUATION , 0.0 );
glLightf( GL_LIGHT0 , GL_QUADRATIC_ATTENUATION , 0.0 );

 

环境光、漫反射光和镜面光的强度都衰减,
辐射光和全局环境光的强度不衰减

 

3.1 光源衰减 - 示例

 

程序截图

 

未启用光源衰减

 

 

启用光源衰减后

 

源码下载

 


CSharp_OpenGL_Lighting_Attenuation.rar

 

4 聚光

 

位置光源可以定义成聚光形式,即将光的形状限制在一个圆锥内。
用来模拟现实世界中的聚光灯。聚光的具体使用步骤如下:

 

4.1 设置聚光源位置

 

GLfloat light_position[]={ 1.0 , 1.0 , 1.0 , 1.0 };
glLightfv( GL_LIGHT0 , LIGHT_POSITION , light_position );

 

4.2 设置聚光最大散布角

 

聚光最大散布角就是光锥的轴与中心线的夹角,也就是光锥顶角的一半。
聚光最大散布角可以选择在[ 0.0 , 90.0 ]之间的值,以及一个特定值:180.0
缺省时最大散布角为180.0,即顶角为360度,光源照向所有方向。

 

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 };
glLightfv( GL_LIGHT0 , GL_SPOT_DIRECTION , spot_direction );

 

4.4 设置聚光指数

 

聚光指数控制光的集中程度,光锥中心的光强最大,越靠边的光强越小。
缺省时为0,即均匀照射。

 

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 };
glMaterialfv( GL_FRONT , GL_EMISSION , mat_emission );

 

5.1 辐射光 - 示例

 

程序截图

 

 


源码下载

 

CSharp_OpenGL_Lighting_Emission.rar

 


6 控制光源位置

 

光源的位置也可以通过变换矩阵,调整光源函数和视点变换函数来获得三种不同的效果:

 

1.光源位置保持固定
2.光源绕物体移动
3.光源随视点移动

 

6.1 物体旋转 光源平移 - 示例

 

程序截图

 

 

OpenGL之路(八)添加光照效果和键盘控制

在opengl中添加光照的效果,可用键盘控制放大缩小 w键放大 s键缩小 d键开关灯 预览效果如下: 源码如下: #include #include #include #pragma co...
  • xianyun2009
  • xianyun2009
  • 2014年09月19日 09:39
  • 1753

OpenGL光照模型--四种光照效果

OpenGL光照模型           为了能看出3D效果,给场景中添加光源。如果没有光照,绘出的球看上去和一个二维平面上圆没什么差别,如下图,左边为有光照效果的球体,右边为同一个球体但没有设置光...
  • langzi007008
  • langzi007008
  • 2016年04月16日 20:37
  • 2585

OpenGL ES 光照效果

一个立方体 光照模型 环境光 散射光 镜面光为了演示光照效果,在前面学习过的内容基础上我们首先创建一个立方体,同时为了看起来直观一些,这个立方体每个面采用中心为白色,周围红色的渐变方案,不然看上去同样...
  • cauchyweierstrass
  • cauchyweierstrass
  • 2016年10月24日 22:54
  • 1795

浅析OpenGL光照

浅谈OpenGL的光照          之前从来都没有涉及光照的内容,心想只要能通过常规的方法渲染出几何体甚至是模型就可以了,然而没有光照的日子注定是苦涩的,因为仅凭几何体和模型的颜色无法达到真是...
  • jiangcaiyang123
  • jiangcaiyang123
  • 2013年08月07日 13:21
  • 4269

openGL的光照与材料(一)

真实感图形绘制是计算机图形学的一个重要组成部分,它综合利用数学、物理学、计算机科学和其它科学知识在计算机图形设备上生成象彩色照片那样的具有真实感的图形。一般说来,用计算机在图形设备上生成真实感图形必须...
  • chenxiao88957478
  • chenxiao88957478
  • 2016年02月29日 10:35
  • 1105

OpenGL:光照、模型视图投影变换

OpenGL:光照、模型视图投影变换OpenGL光照模型视图投影变换 数学基础 程序 库配置 程序图示 代码 main shaderwrapperh vertex shadermvp_testvs f...
  • unclerunning
  • unclerunning
  • 2017年05月02日 18:18
  • 403

OpenGL学习脚印: 光照基础(basic lighting)

写在前面 上一节坐标变换过程,总结了OpenGL中顶点的处理过程。有了前面的基础,从本节开始,我们可以开始学习OpenGL中包括光照、模型加载等主题。光照是一个复杂的主题,本节学习简单的Phon...
  • ziyuanxiazai123
  • ziyuanxiazai123
  • 2016年06月12日 23:39
  • 5316

OpenGL中启用光照前的准备——指定法线

OpenGL中启用光照前的准备——指定法线      我们在使用光源时,除了强度和颜色之外,还需要指定光源的位置和方向,并且这些光源的位置和方向将会极大地影响场景的外观。      Open...
  • Haohan_Meng
  • Haohan_Meng
  • 2014年12月07日 08:21
  • 4483

给立方体添加光照和材质

之前做出来的东西虽然说也有颜色,但是光照效果我是一直都想添加的,而且估计学习opengl这一部分的东西也要在这个之后完结了,开始打算做更贴近于我自己专业的东西了,那就加把劲,把它搞定...
  • lafengxiaoyu
  • lafengxiaoyu
  • 2016年04月28日 21:36
  • 1227

OpenGL 4.0 GLSL 用多个光照模型

在多个光照模型中,我们需要计算每个光照模型的颜色值,然后把这些颜色值相加得到最终物体表面的颜色值。 通常,我们会创建一个统一的数组来存储光源的位置和光照强度(密度)(见下文shader) 如图:一...
  • zhuyingqingfen
  • zhuyingqingfen
  • 2014年02月12日 09:47
  • 2534
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:OpenGL 复杂光照效果(转)
举报原因:
原因补充:

(最多只允许输入30个字)