OpenGL支持库及向导使用教程 下载本文

大连大有吴涛易语言软件开发有限公司 版权所有

时候,环境光变得很亮,而到了夜晚环境光变得很暗。

漫反射光是由其他非发光物体反射而均匀发出的光线。

镜面光来自特定的一个方向,在这个方向上光线最强。就好象当镜子转到一定角度,会看到刺眼的强光一样。

除了受到光地影响以外,物体本身地材质也很重要,它反映了对光的各个部分的不同反射情况。玻璃、金属等会反射大多数的光,看起来会更明亮一些,而毛皮、塑料等则会吸收部分光线显示它自己的颜色。

在真实世界中,要远比这个复杂地多。例如在大家走进一个漆黑的房间里,这时看到的只有黑色;打开电灯,附近的物体会被照亮,这时相当于启用了一个光源。光线打在一个玻璃杯上发出刺眼得光芒,那是因为有镜面光的存在;再打开窗户,这时大家又启用了另外一个光源,太阳光照了进来,因为空气中灰尘的反射,整个房间变得亮起来,这是环境光起了作用。因为有漫反射光的存在,可以看清每个物体自身的颜色。还由于材质的不同,一盆真花要比假花看起来鲜艳得多。

通常为了节省系统资源,不是每次画模型都改变光源和材质的参数,大家还可以用“设置材质颜色”来改变模型的显示效果。

2.6.1 使用光照的一般过程:

启用功能 (#零号~#七号光源)→设置光源的各项参数或者材质的各项参数→启用功能(#光照)→画出使用光照的模型→停用功能 (#零号~#七号光源)→停用功能(#光照)

在“框架初始化”子程序中加上 启用功能 (#光照) 启用功能 (#零号光源)

表 5

参数名称 环境光 漫反射光 镜面光 光源位置 光源聚光指数 点光源聚光截止角 常量衰减 线形衰减 二次方衰减 零号缺省值 (0,0,0,1) (1,1,1,1) (1,1,1,1) 一号~七号缺省值 (0,0,0,1) (0,0,0,1) (0,0,1,0)前面三位表示坐标,最后一位为0时,表示平行光。否则,表示点光源。 0 180在[0,90]范围内表示打开聚光灯,180表示关闭聚光灯 1 0 0 有关材质的使用方法可以参考例程“光照效果.e” 调整各个颜色的数值和形状可以看到光照产生的变化效果。 运行后可以看到图 13中效果:

19

大连大有吴涛易语言软件开发有限公司 版权所有

图 13

调整聚光角度和衰减选项以及聚光指数选项可以看到聚光灯产生的变化效果。 设置光源参数 (#零号光源, #点光源聚光截止角, 滑块条1.位置) 标签1.标题 = 到文本 (滑块条1.位置) + “度” 绘图 () 有关聚光灯的使用方法可以参考例程“聚光灯.e” 运行后可以看到图 14中效果:

20

大连大有吴涛易语言软件开发有限公司 版权所有

图 14

2.6.2 使用材质颜色的一般过程:

设置材质颜色的各项参数→启用功能(#材质颜色)→画出使用光照的模型→停用功能(#材质颜色)

练习:

下面就通过一个例子来理解一下光照。 1. 启动易语言OpenGL向导;

2. 在第五页“投影模式”中指定对称透视投影; 3. 点击完成按钮创建程序;

4. 在“框架程序集”中加入程序集变量: 程序集变量 红色, 小数型, , 数组4 程序集变量 绿色, 小数型, , 数组4 程序集变量 蓝色, 小数型, , 数组4 程序集变量 黑色, 小数型, , 数组4 程序集变量 白色, 小数型, , 数组4

程序集变量 蓝色镜面光, 小数型, , 数组4 程序集变量 黄色散射光, 小数型, , 数组4

5. 在“框架初始化”子程序的末尾加上以下代码: 红色 = { 1, 0, 0, 1 } 绿色 = { 0, 1, 0, 1 } 蓝色 = { 0, 0, 1, 1 }

21

大连大有吴涛易语言软件开发有限公司 版权所有

黑色 = { 0, 0, 0, 1 }

蓝色镜面光 = { 0, 0, 0.5, 1 } 黄色散射光 = { 0.5, 0.5, 0, 1 } 白色 = { 1, 1, 1, 1 }

设置光源参数 (#零号光源, #环境光, 白色) ' 白色环境光 设置光源参数 (#零号光源, #漫反射光, 白色) ' 白色漫反射光 设置光源参数 (#零号光源, #镜面光, 白色) ' 白色镜面光

设置光源参数 (#零号光源, #光源位置, { 0, 1, 1, 0 }) ' 光源坐标为(0,1,1) 6. 加入一个子程序“画球”,代码如下: 子程序 画球

参数 环境光, 小数型, 数组 参数 漫反射光, 小数型, 数组 参数 镜面光, 小数型, 数组 参数 散射光, 小数型, 数组 参数 亮光, 小数型

设置材质 (#正面, #环境光, 环境光) 设置材质 (#正面, #漫反射光, 漫反射光) 设置材质 (#正面, #镜面光, 镜面光) 设置材质 (#正面, #散射光, 散射光) 设置材质 (#正面, #亮光, 亮光) 创建实心球 (1, 20, 20)

7. 在“绘图”子程序中标有“' 在这里加入你的代码”的下面加入以下代码: 启用功能 (#光照) 启用功能 (#零号光源) 坐标平移 (-6, 0, -12)

画球 (红色, 黑色, 黑色, 黑色, 0)

第一个 红色环境光 没有漫反射光 没有镜面光 没有散射光 没有亮光 坐标平移 (3, 0, 0)

画球 (红色, 绿色, 黑色, 黑色, 0)

第二个 红色环境光 绿色漫反射光 没有镜面光 没有散射光 没有亮光 坐标平移 (3, 0, 0)

画球 (红色, 绿色, 蓝色镜面光, 黑色, 0)

第三个 红色环境光 绿色漫反射光 蓝色镜面光 没有散射光 没有亮光 坐标平移 (3, 0, 0)

画球 (红色, 绿色, 蓝色镜面光, 黄色散射光, 0)

第四个 红色环境光 绿色漫反射光 蓝色镜面光 黄色散射光 没有亮光 坐标平移 (3, 0, 0)

画球 (红色, 绿色, 蓝色镜面光, 黄色散射光, 128)

第五个 红色环境光 绿色漫反射光 蓝色镜面光 黄色散射光 全亮光 停用功能 (#光照) 停用功能 (#零号光源) 参考例程“第六课练习.e” 运行后可以看到图 15中效果:

22