当前位置:文档之家› OpenGL光照

OpenGL光照


简单光照模型
当光照射到一个物体表面上时,会出现三种情 形。
– 首先,光可以通过物体表面向空间反射,产生反射光。 – 其次,对于透明体,光可以穿透该物体并从另一端射
出,产生透射光。 – 最后,部分光将被物体表面吸收而转换成热。
在上述三部分光中,仅仅是透射光和反射光能够进入人 眼产生视觉效果。简单光照模型只考虑被照明物体表 面的反射光影响,假定物体表面光滑不透明且由理想 材料构成,环境假设为由白光照明。
glEnable(GL_LIGHTING);
若使光照无效,则调用gDisable(GL_LIGHTING)可 关闭当前光照。然后,必须使所定义的每个光源有效, 例中只用了一个光源,即:
glEnable(GL_LIGHT0);
其它光源类似,只是光源号不同而已。
• 材质颜色
材质
OpenGL中,材质的定义与光源的定义很相似,是通 过定义材料对红、绿、蓝三色光的反射率来近似定义材 料的颜色。象光源一样,材料颜色也分成环境、漫反射 和镜面反射成分,它们决定了材料对环境光、漫反射光 和镜面反射光的反射程度。
在进行光照计算时,材料对环境光的反射率与每个进 入光源的环境光结合,对漫反射光的反射率与每个进入 光源的漫反射光结合,对镜面光的反射率与每个进入光 源的镜面反射光结合。
对环境光与漫反射光的反射程度决定了材料的颜色, 并且它们很相似。对镜面反射光的反射率通常是白色或 灰色(即对镜面反射光中红、绿、蓝的反射率相同)。 镜面反射高光最亮的地方将变成具有光源镜面光强度的 颜色。例如一个光亮的红色塑料球,球的大部分表现为 红色,光亮的高光将是白色的。
OpenGL光组成
• 漫射光来自一个方向,它垂直于物体时比倾斜时 更明亮。一旦它照射到物体上,则在各个方向上 均匀地发散出去。于是,无论视点在哪里它都一 样亮。来自特定位置和特定方向的任何光,都可 能有散射成分。
• 镜面光来自特定方向并沿另一方向反射出去,一 个平行激光束在高质量的镜面上产生100%的镜面 反射。光亮的金属和塑料具有很高非反射成分, 而象粉笔和地毯等几乎没有反射成分。因此,从 某种意义上讲,物体的反射程度等同于其上的光 强(或光亮度)。
光强度衰减
• 辐射光线从一点光源出发在空间中传播时, 通常可按以下因子进行衰减 f(d)=1/(a0+a1d+a2d2) d为光线经过的路径长度
• 考虑衰减,则物体表面某点处光强度为 I=Idiff+Ispec=kaIa+f(d)(kdIlcos θ +ksIlcosnsφ)
OpenGL
在OpenGL简单光照模型中的几种光分为: 辐射光(Emitted Light)、环境光(Ambient Light)、漫射光(Diffuse Light)、镜面光 (Specular Light)。
OpenGL光照
生成真实感图形基本步骤
一:建模,即用一定的数学方法建立所需三维场景 的几何描述,场景的几何描述直接影响图形的复 杂性和图形绘制的计算耗费;
二:将三维几何模型经过一定变换转为二维平面透 视投影图;
三:确定场景中所有可见面,运用隐藏面消隐算法 将视域外或被遮挡住的不可见面消去;
四:计算场景中可见面的颜色,即根据基于光学物 理的光照模型计算可见面投射到观察者眼中的光 亮度大小和颜色分量,并将它转换成适合图形设 备的颜色值,从而确定投影画面上每一象素的颜 色,最终生成图形。
Light Source

• 光源有许多特性,如颜色、位置、方向等。选择 不同的特性值,则对应的光源作用在物体上的效

果也不一样。


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

创建具有某种特性的光源。其中第一个参数
light指定所创建的光源号,如GL_LIGHT0、
对于材质,R、G、B值为材质对光的R、G、B 成分的反射率。比如,一种材质的R=1.0、G=0.5、 B=0.0,则材质反射全部的红色成分,一半的绿色 成分,不反射蓝色成分。也就是说,若OpenGL的 光源颜色为(LR、LG、LB),材质颜色为(MR、 MG、MB),那么,在忽略所有其他反射效果的情 况下,最终到达眼睛的光的颜色为(LR*MR、 LG*MG、LB*MB)。
光 • 辐射光是最简单的一种光,它直接从物体发出并 且不受任何光源影响。
组 • 环境光是由光源发出经环境多次散射而无法确定 其方向的光,即似乎来自所有方向。一般说来,

房间里的环境光成分要多些,户外的相反要少得
多,因为大部分光按相同方向照射,而且在户外
很少有其他物体反射的光。当环境光照到曲面上
时,它在各个方向上均等地发散(类似于无影灯 光)。即没有空间和方向上的特征。
GL_LIGHT1、...、GL_LIGHT7。第二个参数
pname指定光源特性,这个参数的辅助信息见下
表。最后一个参数设置相应的光源特性值。
• 光源位置可以是无限远,称为方向光源,可以认 为是平行的,另一种是点光源,也称为位置光源,
当定义时w为0时,即为方向光源

光源特性
启动光照
• 在OpenGL中,必须明确指出光照是否有效或无效。如 果光照无效,则只是简单地将当前颜色映射到当前顶点 上去,不进行法向、光源、材质等复杂计算,那么显示 的图形就没有真实感,如前几章例程运行结果显示。要 使光照有效,首先得启动光照,即:
材质定义
• 材质的定义与光源的定义类似。其函数为:
void glMaterial{if}[v](GLenum face,GLenum pname,TYPE param);
定义光照计算中用到的当前材质。face可以是 GL_FRONT、GL_BACK、GL_FRONT_AND_BACK, 它表明当前材质应该应用到物体的哪一个面上;pname 说明一个特定的材质;param是材质的具体数值,若函数 为向量形式,则param是一组值的指针,反之为参数值本 身。非向量形式仅用于设置GL_SHINESS。pname参数 值具体内容见表。另外,参数 GL_AMBIENT_AND_DIFFUSE表示可以用相同的RGB 值设置环境光颜色和漫反射光颜色。
材质定义
材质
RGB 值和 光源
RGB 值的 关系
材质的颜色与光源的颜色有些不同。对于源, R、G、B值等于R、G、B对其最大强度的百分比。 若光源颜色的R、G、B值都是1.0,则是最强的白光; 若值变为0.5,颜色仍为白色,但强度为原来的一半, 于是表现为灰色;若R=G=1.0,B=0.0,则光源 为黄色。
相关主题