大连大有吴涛易语言软件开发有限公司 版权所有
坐标平移 (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