OpenGL第18,19,20讲小结
18讲是通过调用库函数画一些简单的二次几何体,比如球体、圆锥体、圆盘等等。
19讲简单的讲了下粒子系统。其实就是三角形贴上星星的纹理,通过启用混合(GL_BLEND)来达到一种动态的粒子效果。通过修改粒子刷新位置,粒子的加速度、初始速度、衰减速度等等,可以做成如喷泉、瀑布、火焰、等等,也可以当当五毛特效,反正我是玩的不亦乐乎。
接下来20讲,讲了一个使用掩膜从而形成一种镂空的效果,我觉得有点绕。理来理去最终有了自己的一些理解,先贴下代码吧:
int DrawGLScene(GLvoid) // Here's Where We Do All The Drawing
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear Screen And Depth Buffer
glLoadIdentity(); // Reset The Current Modelview Matrix
glTranslatef(0.0f,0.0f,-2.0f); // 物体移入屏幕2个单位
glBindTexture(GL_TEXTURE_2D, texture[LOGO]); // 选择Logo纹理
glBegin(GL_QUADS); // 绘制纹理四边形
glTexCoord2f(0.0f, -roll+0.0f); glVertex3f(-1.1f, -1.1f, 0.0f);
glTexCoord2f(3.0f, -roll+0.0f); glVertex3f( 1.1f, -1.1f, 0.0f);
glTexCoord2f(3.0f, -roll+3.0f); glVertex3f( 1.1f, 1.1f, 0.0f);
glTexCoord2f(0.0f, -roll+3.0f); glVertex3f(-1.1f, 1.1f, 0.0f);
glEnd();
glEnable(GL_BLEND); // 启用混合
glDisable(GL_DEPTH_TEST); // 禁用深度测试
if (masking) // 是否启用“掩模”
{
glBlendFunc(GL_DST_COLOR,GL_ZERO); // 使用黑白“掩模”混合屏幕颜色
}
if (scene)
{
glTranslatef(0.0f,0.0f,-1.0f); // 移入屏幕一个单位
glRotatef(roll*,0.0f,0.0f,1.0f); // 沿Z轴旋转
if (masking) // “掩模”是否打开
{
glBindTexture(GL_TEXTURE_2D, texture[MASK2]); // 选择第二个“掩模”纹理
glBegin(GL_QUADS); // 开始绘制四边形
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.1f, -1.1f, 0.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.1f, -1.1f, 0.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.1f, 1.1f, 0.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.1f, 1.1f, 0.0f);
glEnd();
}
glBlendFunc(GL_ONE, GL_ONE); // 把纹理2复制到屏幕(我的理解是把经过处理(白的变透明,其他颜色变为黑色)的黑白掩膜粘到接下来的这个纹理后面光从后面透过来,以贴在后面的掩膜图为准,能透则透)
glBindTexture(GL_TEXTURE_2D, texture[IMAGE2]); // 选择第二个纹理
glBegin(GL_QUADS); // 绘制四边形
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.1f, -1.1f, 0.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.1f, -1.1f, 0.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.1f, 1.1f, 0.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.1f, 1.1f, 0.0f);
glEnd();
}
else
{
if (masking) // “掩模”是否打开
{
glBindTexture(GL_TEXTURE_2D, texture[MASK1]); // 选择第一个“掩模”纹理
glBegin(GL_QUADS); // 开始绘制四边形
glTexCoord2f(roll+0.0f, 0.0f); glVertex3f(-1.1f, -1.1f, 0.0f);
glTexCoord2f(roll+4.0f, 0.0f); glVertex3f( 1.1f, -1.1f, 0.0f);
glTexCoord2f(roll+4.0f, 4.0f); glVertex3f( 1.1f, 1.1f, 0.0f);
glTexCoord2f(roll+0.0f, 4.0f); glVertex3f(-1.1f, 1.1f, 0.0f);
glEnd();
}
glBlendFunc(GL_ONE, GL_ONE); // 把纹理1复制到屏幕
glBindTexture(GL_TEXTURE_2D, texture[IMAGE1]); // 选择第一个纹理
glBegin(GL_QUADS); // 开始绘制四边形
glTexCoord2f(roll+0.0f, 0.0f); glVertex3f(-1.1f, -1.1f, 0.0f);
glTexCoord2f(roll+4.0f, 0.0f); glVertex3f( 1.1f, -1.1f, 0.0f);
glTexCoord2f(roll+4.0f, 4.0f); glVertex3f( 1.1f, 1.1f, 0.0f);
glTexCoord2f(roll+0.0f, 4.0f); glVertex3f(-1.1f, 1.1f, 0.0f);
glEnd();
}
glEnable(GL_DEPTH_TEST); // 启用深度测试
glDisable(GL_BLEND); // 禁用混合
roll+=0.002f; // 增加纹理滚动变量
if (roll>1.0f) // 大于1则减1
{
roll-=1.0f;
} return TRUE; // 成功返回
}
上述代码为创建掩膜的一系列步骤。我的理解是:首先启用黑白掩膜混合屏幕颜色(没怎么懂它的意思,意会一下吧)来对黑白纹理图进行处理;
glBlendFunc(GL_DST_COLOR,GL_ZERO);
这个很重要,因为有了它,才能把只有黑白两色的掩膜的白色变为透明,其他颜色变成黑色(当然黑白掩膜只有黑白两色,所谓其他颜色就只有黑色而已),把黑白掩膜的白色变成透明之后,用它:
glBlendFunc(GL_ONE, GL_ONE); // 把纹理2复制到屏幕(我的理解是把经过处理(白的变透明,其他颜色变为黑色)的黑白掩膜粘到接下来的这个纹理后面光从后面透过来,以贴在后面的掩膜图为准,能透则透)
来将刚才处理好的那层掩膜给复制到屏幕上,然后把与掩膜相对应的纹理图加载进来,画一个正方形,这样之后,后加载的这个纹理跟之前那个纹理就贴在一起了,掩膜在后面。这样就达到了镂空的效果,如下图:
这是不使用掩膜的效果:
我理解的原理就是这样的,想象光是从后面那块有字的正方形发射出来的,这些光通过这个紫色的网进入我们的眼睛,光能不能透过就取决于掩膜哪些地方是透明的,哪些地方不透明。通过反复的试验观察我就得出了这样一个结论,至于是否正确等待后面有机会再验证吧。
假如不用掩膜,那最上面这层图像就会变得半透明,远没有用掩膜那样富有层次感。以上所有是今天所得,恩,感谢NeHe的教程。
OpenGL第18,19,20讲小结的更多相关文章
- OpenGL第6、7讲小结
因为内容比较多,所以只看了两讲(强行解释). 一讲讲了如何给各个面贴纹理,一讲讲了加光照和按键控制. 现在讲的都是给规则的面贴纹理,像正方形,刚好纹理图也是正方形,那像人物模型的衣服贴起来用代码控制得 ...
- 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!
// test20.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #include< ...
- 《马上有招儿:PPT商务演示精选20讲(全彩) 》
<马上有招儿:PPT商务演示精选20讲(全彩) > 基本信息 作者:马建强 霍然 出版社:电子工业出版社 ISBN:9787121225123 上架时间:2014-3-11 出版日期 ...
- PPT2010学习笔记(共20讲)
第1讲 商务PPT中的必备元素 # 设计需打破规范 第2讲 封面页设计(一) 大图型封面页 # 基础知识点: 插入矩形和圆形 设置半透明色 设置字体变形效果 图片增强工具 利用过渡色虚化图片边缘 ...
- html5--1.20 课程小结与若干点补充
html5--1.20 课程小结与若干点补充 学习要点: 1.第一章HTML5基础知识做一个小结2.对本章课程中部分内容做几点补充 课程小结 对本章的知识点做一个简单的回顾,并对其中个别知识点做若干补 ...
- 2016年11月4日 星期五 --出埃及记 Exodus 19:20
2016年11月4日 星期五 --出埃及记 Exodus 19:20 The LORD descended to the top of Mount Sinai and called Moses to ...
- 第20讲- Spinner与适配器模式
第20讲 Spinner与适配器模式 使用Spinner相当于从下拉列表中选择项目,Spinner是一个每次只能选择所有项的一个项的控件.它的项来自于与之相关联的适配器中.Spinner的重点问题就是 ...
- Wed Sep 19 20:48:46 CST 2018 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection mus
Wed Sep 19 20:48:46 CST 2018 WARN: Establishing SSL connection without server's identity verificatio ...
- Effective STL 学习笔记:19 ~ 20
Effective STL 学习笔记:19 ~ 20 */--> div.org-src-container { font-size: 85%; font-family: monospace; ...
随机推荐
- Quartz表达式
“*”字符代表所有可能的值 因此,“*”在子表达式(月)里表示每个月的含义,“*”在子表达式(天(星期))表示星期的每一天 “/”字符用来指定数值的增量 例如:在子表达式(分钟)里的“0/15”表示从 ...
- cocos2d-x学习之自动内存管理
一.自动内存管理 1)概述 C++语言默认是没有提供自动内存管理的.使用者需要自己分配,自己释放.在cocos2d-x里提供了一个自动内存管理的方案.主要是通过CCObject来提供的,用户只要继承了 ...
- 剑指 offer set 3 旋转数组的最小数字
总结 1. 没有重复元素的旋转数组可用 logn 时间内求出结果. 解法有两个步骤, 先是求出发生旋转的点(以 array[0] 为支点求得), 然后用正常的二分查找给出结果 2. 有重复元素元素的旋 ...
- 线性表 及Java实现 顺序表、链表、栈、队列
数据结构与算法是程序设计的两大基础,大型的IT企业面试时也会出数据结构和算法的题目, 它可以说明你是否有良好的逻辑思维,如果你具备良好的逻辑思维,即使技术存在某些缺陷,面试公司也会认为你很有培养价值, ...
- Trie 树 及Java实现
来源于英文“retrieval”. Trie树就是字符树,其核心思想就是空间换时间. 举个简单的例子. 给你100000个长度不超过10的单词.对于每一个单词,我们要判断他出没出现过,如果出现 ...
- java中静态的代码块,静态变量,静态方法
简单了解一下java虚拟机--jvm几个内存区域: 方法区:在java的虚拟机中有一块专门用来存放已经加载的类信息.常量.静态变量以及方法代码的内存区域, 常量池:常量池是方法区的一部分,主要用来存放 ...
- c++ 设计模式4 (Strategy)
3.2 Strategy (策略模式) 动机:在软件构建过程中,某些对象使用的算法可能多种多样,经常改变,如果将这些算法都编码到对象中,将会使对象变得异常复杂,而且有时候支持不使用或不常使用的算法也是 ...
- oracle PL/SQL(procedure language/SQL)程序设计(续集)之PL/SQL函数
PL/SQL函数 examples:“ 构造一个邮件地址 v_mailing_address := v_name||CHR(10)|| ...
- Java为什么只能单继承?
就是因为C++里多重继承功能强大但是容易出错,Java才给取消掉了.如果,A和B都继承于C,再写个D继承A和B.那么C里面有个方法,A和B继承过去后都进行了覆盖,那么D到底是该继承A里面的版本呢还是B ...
- Eclipse中web项目的默认发布路径改为外部Tomcat中webapp路径
可参考http://www.cnblogs.com/mihu/p/4772509.html 和http://www.cnblogs.com/dyllove98/archive/2013/06/07/3 ...