OpenGL中的光照系列之一[基本理论]

来源:互联网 发布:瑜伽 书籍 知乎 编辑:程序博客网 时间:2024/05/01 01:40
  • 概述

神说、要有光、就有了光   —— 圣经

OpenGL中的光照、材质和颜色总是紧密联系在一起的,光作为OpenGL中的一个基本特性,在模拟真实环境中有着不可替代的作用。本系列讨论颜色与光照的基本原理、OpenGL中光照的模拟方式、各种参数的设置以及使用等,通过这些内容,让读者对整个OpenGL的光照体系有一个完整的认识。

尽管当前OpenGL的编程从旧式的固定管线模式(glBegin、glVertex、glEnd)过渡到了当今的可编程管线模式(Shader),但是本文中描述的内容依然适用。

  • 什么是颜色

颜色只是某种波长的光,能够被肉眼看到。在高中物理中我们知道光分为很多类型,包括可见光、红外线、紫外线、X射线等,我们眼睛可以接受的只是其中某个波段的光,下图是可见光的波普范围:


当一个物体我们说它是红色时,实际上它并不是红色,它只是反射红色的光(而吸收了其他颜色的光),这样我们眼睛接受到的都是红色的光,让我们觉得它是红色的。如果我们使用绿色的光去照射它,那么我们实际上什么也看不到(因为绿色的光都被物体吸收了),许多魔术师都用这种方式来“欺骗”我们的眼睛。

  • 人眼是光子检测器

眼睛有三种类型的锥细胞,它们都会对光子做出反映,每种类型的锥细胞对特定波长的光子敏感,其中一种对红色敏感、一种对绿敏感、另一种对蓝色敏感,这些不同的锥细胞被指定波长的光子刺激到之后,大脑会接受到信号,让人眼感受到物体的颜色。

  • OpenGL对光的模拟

现实生活中的光是难以描述的,OpenGL使用了一种简单的方式实现对光的模拟,它将光分为三种成分:环境光(Ambient)、散射光(Diffuse)、和镜面光(Specular),这只是一种模拟方式,读者也可以使用自己的方式来模拟光照,这种方式的模拟称为ADS光照模型。下面我们对这些光的成分逐一分析:

  • 环境光(Ambient Light)

环境光并不是来自特定的方向,它来自某个光源,但却在房间或者场景中四处反射,没有方向可言,有环境光所照射的物体在所有方向的表面都是均匀照亮的,因此看起来像一个2D的物体,下图是某个球体仅在环境光照射下的效果:


  • 散射光(Diffuse Light)

散射光具有方向性,来自于一个特定的方向,根据入射光线的角度在表面上均匀的反射开来。被散射光照射的表面看起来更亮一些,下图是一个球体受到红色的散射光照射之后的效果(光线从左向右)


  • 镜面光(Specular Light)

镜面高光也具有方向性,它的光线来自同一个方向,与散射光不同的是,入射之后的光线会沿一个特定的方向反射。高强度的镜面光趋向于在它表面形成一个亮点,由于它的高度方向性,镜面光甚至可能看不到,下图是一个受镜面光照射的球体的效果:


  • 综合考虑

没有一种光源是纯粹由上面所述的任何一种类型的光所组成的。事实上光源是由各种强度的不同类型的光所组成的。例如实验室的红色激光束几乎是由纯的红色镜面光组成的,当它照射到物体时会产生一个非常强的亮点。但是烟或灰尘会导致激光束发散,产生非常小的环境光成分。

  • OpenGL中的材质

有前面的论述我们知道,物体的颜色如何最终确定除了和光有关系之外,还和物体的材质有关。一个物体的颜色是由它所反射的光的波长来定义的,一个蓝色的球反射了绝大部分的蓝色光子,并吸收了绝大部分的其他光子。一般来说现实世界中的绝大多数场景都是由均匀包含所有各种颜色光的白色光组成,绝大多数物体都呈现它们的“自然颜色”。总体来说就是:在开启光照计算之后,物体的颜色最终是什么需要依据光照和物体的材质共同决定。OpenGL的物体材质包括如下部分:

  • 环境颜色(AMBIENT)

材质中的环境颜色会与光中的环境颜色计算是最终决定物体颜色的因素之一,具体的作用计算可以参考后续内容

  • 散射颜色(DIFFUSE)

会与光中的对应部分计算决定物体颜色的因素之一

  • 镜面颜色(SPECULAR)

同上

  • 镜面指数(SHINESS)

也是参与最终决定物体颜色计算的一个参数

  • 发射颜色(EMISSION)

可以让物体看上去好像发光体,一般用来模拟场景中的光源效果


下文接着介绍OpenGL光照的计算

0 0