OpenGL 光照常识

原创 2007年10月09日 12:00:00

1. 几个概念

  • 环境光——经过多次反射而来的光称为环境光,无法确定其最初的方向,但当特定的光源关闭后,它们将消失.
  • 全局环境光——它们并非来自特定的光源,这些光经过了多次散射,已经无法确定其光源位于何处.
  • 散射光——来自同一方向,照射到物体表面后,将沿各个方向均匀反射,因此,无论从哪个方向观察,表面的亮度都相同.
  • 镜面反射光——来自特定方向,也被反射到特定方向.镜面反射度与之相关.
  • 材质发射光——用于模拟发光物体.在OpenGL光照模型中,表面的发射光增加了物体的亮度,它不受光源的影响,另外,发射光不会给整个场景中增加光线.

2. 一些常识

  • OpenGL在模拟光源时,假定将发射出的光分解为R,G,B三个分量,这样,对于每个光源,可以使用其发射的红光,绿光和蓝光的量来描述;而对于表面的材质,可以使用其在各个方向反射的红光,绿光和蓝光的比例来描述.
  • 光源只对吸收或者反射光线的表面产生影响,每个面都由具有各种属性的材质组成,材质本身可能发射光(如汽车前灯),沿所有方向散射入射光(一般情况)或者沿特定方向反射入射光(如镜面和其它光滑表面).
  • 材质的环境色,散射色和镜面反射色,它们决定了材质对环境光,散射光和镜面反射光的反射率.将材质的环境光反射率与每个光源的环境光分量相乘;将散射光反射率与散射光分量相乘;将镜面反射光反射率与镜面反射光相乘.材质对环境光和散射光的反射率决定了其颜色,而这两种反射率往往是相等的,材质的镜面反射色通常是白色或灰色(即(1.0,1.0,1.0)),因此镜面反射点的颜色一般为光源中镜面反射光的颜色.
  • OpenGL光照模型将光照分为四个独立的部分:环境光,散射光,镜面反射光和发射光,这四种光被分别计算,然后叠加起来.
  • 光线的R,G,B值表示各分量的强度,材质的R,G,B值表示材质对相应分量的反射比例.
  • 定向光源不存在三种光线的衰减,但是定位光源存在衰减.
  • 被照射的物体不会向其它物体发出光线.

3. 向场景中添加光线的步骤

  • 为物体的每个顶点定义法线向量,这些法向量决定了物体相对于光源的朝向.
  • 创建和选择一个或多个光源,并设置光源的位置.
  • 创建和选择光照模型,它定义了全局环境光的等级和观察点的实际位置(用于光照计算).
  • 启用光照.
  • 设置场景中物体的材质属性.

4. 相应的OpenGL函数

  • 为顶点指定法向量:glNormal3fv(n0);glVertex3fv(v0);
  • 创建光源,指定位置:
    glLightfv(GL_LIGHT0,GL_POSITION,light_position); 
    glLightfv(GL_LIGHT0,GL_AMBIENT,light_ambient);注意,GL_POSITION的默认值为(0,0,1,0),它定义了一个指向Z轴负方向的定向光源.
  • 选择光照模型:其包括四项内容,即全局环境光强度,观察点靠近场景还是位于无穷远处,对物体的正面和背面是否采用相同的光照计算,以及是否将镜面反射颜色同环境颜色和散射颜色分开,并在纹理操作后应用它.函数有
    glLightModelfv(GL_LIGHT_MODEL_AMBIENT,lmodel_ambient); glLightModelfv(GL_LIGHT_MODEL_LOCAL_VIEWER,lmodel_viewer)……,其中近视点还是远视点只影响镜面反射区的计算.
  • 启用光照:glEnable(GL_LIGHTING);glEnable(GL_LIGHT0);
  • 设置材质属性:
    用glMaterialfv(GLenum face, GLenum pname, Type* param)函数设置GL_AMBIENT, GL_DIFFUSE, GL_AMBIENT_AND_DIFFUSE, GL_SPECULAR, GL_SHINNESS, GL_EMISSION等值.

5. OpenGL光照中的默认值

  • 光源的环境光默认为(0.0,0.0,0.0,1.0),即没有环境光.
  • 光源的散射光默认为(1.0,1.0,1.0,1.0),即存在白色散射光.
  • 光源的环境反射光默认值有两种情况,一种对应于光源GL_LIGNT0,其GL_SPECULAR为(1.0,1.0,1.0,1.0),即白色光;另一种对应于其它光源,其默认值为(0.0,0.0,0.0,0.0).一般情况下,光源的GL_SPECULAR应该和GL_DIFFUSE值相同.
  • 默认情况下,定位光源向所有方向发射光,但可以将其设置为聚光灯,使之在锥体内发光.
  • 光照模型中,全局环境光默认为(0.2,0.2,0.2,1.0),即存在微弱的白光;视点位置默认为0.0或者GL_FALSE,即无穷远处;默认采用单面光照,即GL_LIGHT_MODEL_TWO_SIDE为0.0或GL_FALSE(在对物体存在切割时,要启用双面光照);默认情况下,镜面反射颜色在纹理映射之前完成,即GL_LIGHT_MODEL_COLOR_CONTROL的值为GL_SINGLE_COLOR.
  • 材质属性的默认值:GL_AMBIENT (0.2,0.2,0.2,1.0); GL_DIFFUSE (0.8,0.8,0.8,1.0); GL_SPECULAR (0.0,0.0,0.0,1.0); GL_SHINNESS 0.0; GL_EMISSION (0.0,0.0,0.0,1.0).

6. 计算

  • 顶点被照射时的颜色:顶点颜色=顶点的发射光颜色  +
                              全局环境光与材质的环境光属性 +
                              各光源中衰减后的环境光,散射光和镜面反射光
      执行光照计算后,颜色值(RGBA模式)被截取到[0.0,1.0].
  • 顶点的发射光颜色即glMaterialfv()中的GL_EMISSION值.
  • 反射的全局环境光 = glLightModelfv()指定的GL_AMBIENT * glMaterialfv()指定的GL_AMBIENT值.
  • 光源的贡献 = 衰减因子 * 聚光效果 * (环境光 + 散射光 + 镜面反射光);其中,环境光 = glLightfv()指定的GL_AMBIENT * glMaterialfv()指定的GL_AMBIENT;
    散射光的计算需要考虑光线的照射角度,光源散射分量和材质的散射属性:
    散射光 = 
     (max{L  dotproduct n,0} * light_diffuse * material_diffuse),L为顶点到光源的 单位矢量,n为顶点的单位法线向量.
    镜面反射光项也取决于光线的照射角度.若(L dotproduct n)<=0;顶点将没有镜面反射光项,否 则镜面反射光取决于下列因素:
     1) 顶点的单位法向量n.
     2) 从顶点指向光源的单位矢量和从顶点指向视点的单位向量的和,此处假设光照模型中采用近视点, 否则第二个被加的单位向量为(0,0,1);然后将相加得到的向量归一化,记为s.
     3) 镜面反射指数(glLightfv()指定的GL_SHINNESS).
     4) 光源的镜面反射光分量(glLightfv()指定的GL_SPECULAR,一般和其GL_DIFFUSE相同).
     5) 材质的镜面反射属性(glMaterialfv()指定的GL_SPECULAR).
     计算公式:(max{s dotproduct n,0})^shinness * light_specular * material_specular.  

用VC++编制FTP客户端应用程序

用VC++编制FTP客户端应用程序  FTP协议将使用两条单独的TCP连接,一条专用于发送FTP命令,另一条则专用于传递数据。初始建立连接时,服务器在21号端口上接收来自客户端的命令连接。当需要传送数...
  • ghj1976
  • ghj1976
  • 2001-08-20 11:36:00
  • 1512

OpenGL光照设置问题

OpenGL在处理光照时把光照系统分为三部分,分别是光源、材质和光照模型。 光源、材质和光照模式都有各自的属性,尽管属性种类繁多,但这些属性都只用很少的几个函数来设置。 使用glLight...
  • Nice_punch
  • Nice_punch
  • 2016-12-28 15:38:33
  • 1620

OpenGL中设置光照的镜面反射效果

OpenGL中设置光照的镜面反射效果      在上一篇笔记中,我们记述了光线的方向与多边形表面的角度计算关系,除此之外,我们还有光源的位置需要指定。我们在ChangeSize函数的内部指定光源的...
  • Haohan_Meng
  • Haohan_Meng
  • 2014-12-14 16:45:29
  • 4709

openGL 光照处理

要绘制逼真的三维物体,必须做光照处理。没有光照的三维物体模型与二维物体没有任何差别,只有具有光照的物体才是真正的三维物体。OpenGL可以控制光照与物体的关系,产生多种不同的视觉效果。下面分几部分叙述...
  • xiaolong662007
  • xiaolong662007
  • 2012-09-28 11:05:07
  • 2306

OpenGL(七) 光照模型及设置

OpenGL把现实世界中的光照系统近似归为三部分,分别是光源、材质和光照环境。 光源就是光的来源,是“光”这种物质的提供者; 材质是指被光源照射的物体的表面的反射、漫反射(OpenGL不考虑...
  • dcrmg
  • dcrmg
  • 2016-11-10 23:42:53
  • 9167

OpenGL光源光照使用范例

1. 光照模型      环境光——经过多次反射而来的光称为环境光,无法确定其最初的方向,但当特定的光源关闭后,它们将消失. 全局环境光——每个光源都能对场景提供环境光。此外,还有一个环境...
  • yaokang522
  • yaokang522
  • 2012-02-27 14:40:52
  • 2139

openGL的光照与材料(一)

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

openGL 光照的学习

小狼学习原创,欢迎批评指正 先上代码
  • wolf96
  • wolf96
  • 2014-07-28 00:25:31
  • 1538

OPENGL学习笔记——光照

1、隐藏表面消除 隐藏表面消除就是消除实心物体被其他物体所遮挡住的部分,最简单的方法就是使用深度缓冲区。深度缓冲区的原理是把一个距离观察平面(通常是近侧裁剪平面)的深度值与窗口中的每一个像素相关联。...
  • John_cdy
  • John_cdy
  • 2015-08-31 09:51:26
  • 1804

探究OpenGL光照模型的着色器实现

OpenGL的着色器是新的显卡提供给开发者一个小程序,为的是让开发者对光照、坐标转换以及像素进行一些个性化的处理。OpenGL的着色器有一种专门的语言:GLSL,现在的GLSL应该全面转向Shader...
  • jiangcaiyang123
  • jiangcaiyang123
  • 2013-09-27 23:08:07
  • 3486
收藏助手
不良信息举报
您举报文章:OpenGL 光照常识
举报原因:
原因补充:

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