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

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

坐标平移 (0, -立方体边长的一半, 0) 乘入矩阵 (影子) 坐标平移 (0, 立方体边长的一半, 0) 设置颜色 (0, 0, 0, 1) 创建实心正方体 (立方体边长的一半 × 2) ' 影子 矩阵出栈 () 设置颜色 (1, 0, 1, 1) 矩阵入栈 () 设置颜色 (0.3, 0.6, 0.7, 1) 创建实心正方体 (立方体边长的一半 × 2) ' 画物体 矩阵出栈 () 坐标平移 (光源位置 [1], 光源位置 [2], 光源位置 [3]) 设置颜色 (1, 0.2, 0.2, 1) 创建实心球 (0.2, 10, 10) ' 画光源点 参考例程“第九课练习.e” 运行后可以看到图 26中效果:

图 26

第十节、混合效果

在OpenGL中可以使模型透明,也可以让纹理镂空,这些都是混合测试起的作用。在红绿蓝混合通道模式下,混合效果更好。

2.10.1 混合测试的一般过程:

混合测试→启用功能 (#混合测试)→画出模型→停用用功能 (#混合测试)

35

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

2.10.2 混合测试的计算原理:

在“混合测试 (源值,目标值)”命令中有两个参数“源值”和“目标值”,代表着混合测试方程里的两部分变量。

混合结果.红色 = 源值.红色×源颜色.红色(Rs) + 目标值.红色×目标颜色.红色(Rd)

混合结果.绿色 = 源值.绿色×源颜色.绿色(Gs) + 目标值.绿色×目标颜色.绿色(Gd)

混合结果.蓝色 = 源值.蓝色×源颜色.蓝色(Bs) + 目标值.蓝色×目标颜色.蓝色(Bd)

混合结果.混合=源值.混合×源颜色.混合(As)+目标值.混合×目标颜色.混合(Ad)

如果以上各个值超出[0,1]的范围,超出部分将被忽略。 参数值可以为以下常量:

参数值 参数 运算结果 0 源值或目标值 (0,0,0,0) 1 源值或目标值 (1,1,1,1)

(Rs,Gs,Bs,As) 源值颜色比例 目标值

(1,1,1,1)—(Rs,Gs,Bs,As) 源值颜色比例反 目标值

源值通道比例 源值或目标值 (As,As,As,As) 源值通道比例反 源值或目标值 (1,1,1,1)—(As,As,As,As) 目标值通道比例 源值或目标值 (Ad,Ad,Ad,Ad)

目标值通道比例反 源值或目标值 (1,1,1,1)—(Ad,Ad,Ad,Ad)

(Rd,Gd,Bd,Ad) 目标值颜色比例 源值

(1,1,1,1)—(Rd,Gd,Bd,Ad) 目标值颜色比例反 源值

源值饱和通道 源值 (f,f,f,1); f=最小值(As,1—Ad)

若“源值”的参数为常数1,“目标值”的参数为常数0,则相当于关闭融合操作 例如:“源值”的参数为常数“源值通道比例”,“目标值”的参数为常数“源值通道比例反”,那么:

混合结果.红色=As×Rs+(1—As)×Rd 混合结果.绿色=As×Gs+(1—As)×Gd 混合结果.蓝色= As×Bs+(1—As)×Bd 混合结果.混合=As×As+(1— As)×Ad

有关混合命令的使用方法可以参考例程“混合效果.e” 其中外面的正方体使用了混合测试,里面的正方体没有使用了混合测试,可以看出它们之间有明显的区别。

运行后可以看到图 27中效果:

36

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

图 27

练习:

下面就来使用混合来模拟聚光灯的效果。 1. 启动易语言OpenGL向导;

2. 在第二页“使用的组件”中选择“窗口”;

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

5. 在“框架程序集”中加入程序集变量: .程序集变量 移动距离, 小数型 .程序集变量 移动方向, 小数型

6. 在资源中加入两张图片作为纹理; .图片 石头纹理 .图片 圆形纹理

7. 加入子程序“绑定纹理图片”子程序: .子程序 绑定纹理图片 .参数 图片, 字节集 .参数 纹理号

.局部变量 文件名, 文本型 .局部变量 文件号

文件名 = 取临时文件名 (取运行目录 ()) 文件号 = 打开文件 (文件名, #重写, 4) .如果 (文件号 ≠ 0)

写出字节集 (文件号, 图片) 关闭文件 (文件号)

绑定纹理号 (#二维纹理, 纹理号) .如果 (载入位图数据 (文件名))

纹理控制 (#二维纹理, #放大纹理滤波, #线性)

纹理控制 (#二维纹理, #缩小纹理滤波, #线性滤镜) .否则

37

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

信息框 (“载入纹理失败!”, 0, “注意:”) .如果结束

.否则

信息框 (“打开文件失败!”, 0, “错误”) .如果结束

.如果真 (取反 (删除文件 (文件名))) 信息框 (“删除临时纹理文件失败!”, 0, “错误”) .如果真结束

8. 在“框架初始化”子程序的末尾加上 设置画面质量 (#透视修正质量, #最佳) 绑定纹理图片 (#石头纹理, 1) 绑定纹理图片 (#圆形纹理, 2) 启用功能 (#二维纹理) 停用功能 (#深度测试) 移动距离 = 0.5 移动方向 = 0.05

9. 在“绘图”子程序中标有“' 在这里加入你的代码”的下面加入以下代码: 坐标平移 (0, 0, -3) 停用功能 (#混合测试) 绑定纹理号 (#二维纹理, 1) 矩阵入栈 ()

坐标平移 (-移动距离, 0, 0) 开始画 (#四边形)

设置纹理映射坐标 (0, 0) 设置点 (-1, -1, 0)

设置纹理映射坐标 (1, 0) 设置点 (1, -1, 0)

设置纹理映射坐标 (1, 1) 设置点 (1, 1, 0)

设置纹理映射坐标 (0, 1) 设置点 (-1, 1, 0) 停止画 () 矩阵出栈 () 矩阵入栈 ()

坐标平移 (移动距离, 0, 0) 启用功能 (#混合测试)

混合测试 (#目标值颜色比例, 1) 绑定纹理号 (#二维纹理, 2) 开始画 (#四边形)

设置纹理映射坐标 (0, 0) 设置点 (-1, -1, 0)

设置纹理映射坐标 (1, 0) 设置点 (1, -1, 0)

38