OpenGL第23-26小结
到后面代码相对而言比较复杂了,因为没有系统的看红宝书(就跟字典一样,兴趣缺缺),很多操作的步骤比较迷糊。
23讲讲解了如何将环境纹理贴在球体、圆柱体等非矩形物体表面,从而达到一个反射周围景色的效果(恩,就像热水瓶内胆那样反射的效果)。我的理解就是一个自动贴纹理的函数的调用,初始化时,
在绘制物体时,
绘制完毕记得关掉,
24讲是从TGA文件中得到字体纹理,避免了调用系统字体,跟之前的一个教程很像,但这个教程又多了一个获取GL扩展模块名的功能,暂时用不到,略过。
25讲是从文本文件中读取点坐标(400多个点)来进行物体的创建,并通过改变每一个点的位置来实现物体间的变换,将点位移的距离进行等分,以达到平滑变化的效果。
26讲,恩,教程里是蒙板缓存,有的地方又叫模板缓存,函数一样。该小节重点应该是通过构建一个模板缓存,来限制镜面中的物体的运动范围(超出范围不予显示),就像通过车窗看外面的风景那样。镜子中的物体仍然需要绘制的,并且其活动范围就是当前视角所看到的镜面中。(程序镜子中的物体是真实存在的,非生活中镜子那样只反射光)。
蒙板补充:启用蒙版测试之后,将地板全部通过测试并将蒙板缓存替换为地板,
glStencilFunc(GL_ALWAYS, , ); // Always Passes, 1 Bit Plane, 1 As Mask
glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE); // We Set The Stencil Buffer To 1 Where We Draw Any Polygon
之后设置作为反射的球体与蒙板的交互:
glStencilFunc(GL_EQUAL, , ); // We Draw Only Where The Stencil Is 1
// (I.E. Where The Floor Was Drawn)
glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); // Don't Change The Stencil Buffer
之后通过测试的才显示。
第七版红宝书的蒙板缓存示例代码跟nehe一样都出问题了,诶,还找不到问题在哪。
然而我纠结的地方确实半透明的实现。。。首先是alpha通道测试函数:
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
我看了看书上的说法,是说这个混合函数是通过RGB通量与alpha或者指定的值进行相乘,相加,之后缩放到规定RGB值范围得到混合(变换)后的RGB值。我数学不是很好,看的云里雾里的。
多的就不说了,我只说我想到的东西,因看到本节示例程序汇总球体表面的灯光反射效果时由一个相同大小的球体贴上相应的贴图实现的:
透明球体我修改ALPHA值怎么一点反应都没有呢?后来多番测试,得到这么点结论:平时使用我用就这两个就好了:
glBlendFunc(GL_SRC_ALPHA, GL_ONE);
glBlendFunc(GL_SRC_ALPHA,GL_ZERO);
GL_ONE全透明,GL_ZERO不透明(黑色)(理论上可以0-1之间自定义),用的时候别忘了开启混合,用完关掉(或者用按键控制整个场景的混合开关。用按键控制的时候要注意,有一些物体灯光+半透明可能不是想要的效果,我测试了一个正方体,在关灯的情况下6个面全是半透明的,是我想要的,然而开灯之后,旋转正方体会发现有些面不是半透明的,原因我不清楚)至于想通过ALPHA值调整透明度的,就用这个吧:
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
不过在使用之前一定要先禁掉灯光,用完之后再恢复,不然修改ALPHA值无变化:
就像这样
glEnable(GL_BLEND); // Enable Blending (Otherwise The Reflected Object Wont Show)
glDisable(GL_LIGHTING); // Since We Use Blending, We Disable Lighting
glColor4f(1.0f, 1.0f, 1.0f, 0.8f); // Set Color To White With 80% Alpha
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // Blending Based On Source Alpha And 1 Minus Dest Alpha
DrawFloor(); // Draw The Floor To The Screen
glEnable(GL_LIGHTING); // Enable Lighting
glDisable(GL_BLEND); // Disable Blending
恩,理论知识缺缺,我也只能通过不断尝试的方式去探索这些开关、函数的使用方法。21讲的小游戏蛮厉害的,22讲的凹凸纹理没看,为什么不看?因为好多啊。。而且数学算法一阵头大,要用的时候套过来用好了。
OpenGL第23-26小结的更多相关文章
- Uniform Generator 分类: HDU 2015-06-19 23:26 11人阅读 评论(0) 收藏
Uniform Generator Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) T ...
- OpenGL第12-14讲小结
首先要为自己为什么没有写第10讲的控制3D场景和第11讲的红旗飘飘呢?因为没看啊~哈哈哈,而且我尝试着运行红旗飘飘的时候电脑蓝屏了(可能不是它的锅),暂时跳过了. 恩,12到14主要了解了这么些东西, ...
- 【23.26%】【codeforces 747D】Winter Is Coming
time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...
- Python-基础-时间日期处理小结
Python-基础-时间日期处理小结 涉及对象 1. datetime 2. timestamp 3. time tuple 4. string 5. date datetime基本操作 1. 获取当 ...
- 第23章 排序算法(包括merge等)
第23章 排序算法 Sorting:1 sort Sort elements in range (function template)2 stable_sort Sort elements pr ...
- Python学习--23 第三方库
本文将介绍python里常用的模块.如未特殊说明,所有示例均以python3.4为例: $ python -V Python 3.4.3 网络请求 urllib urllib提供了一系列用于操作URL ...
- 23.Mysql应用优化
23.应用优化23.1 使用连接池应用启动时创建好连接,以供用户使用,而不是每次创建. 23.2 减少对Mysql的访问 23.2.1 避免对同一数据做重复检索合并简单查询,减少访问次数. 23.2. ...
- Python学习--23 内建模块及第三方库
本文将介绍python里常用的模块.如未特殊说明,所有示例均以python3.4为例: $ python -V Python 3.4.3 网络请求 urllib urllib提供了一系列用于操作URL ...
- oracle 使用db_link 导入导出小结
客户有一个需求,是将一个库中的某个用户迁移到一台新的oracle服务器上,因数据量较小,并且不涉及版本的升级,所以可以采用创建一个dblink,然后通过这个dblink直接从源库将用户数据导出并导入到 ...
- netty源码解解析(4.0)-23 ByteBuf内存管理:分配和释放
ByteBuf内存分配和释放由具体实现负责,抽象类型只定义的内存分配和释放的时机. 内存分配分两个阶段: 第一阶段,初始化时分配内存.第二阶段: 内存不够用时分配新的内存.ByteBuf抽象层没有定义 ...
随机推荐
- ubuntu tweak Install
ubuntu tweak 1:增加PPA源 sudo add-apt-repository ppa:tualatrix/ppa 2:編輯源列表sudo gedit /etc/apt/sources.l ...
- 违章查询免费api接口代码
能够依据城市+车牌号+发动机号查询违章信息列表. 违章实体类 package org.wx.xhelper.model; /** * 违章实体类 * @author wangxw * @version ...
- Jsp中EL表达式的使用
林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 1.什么是EL EL是JSP表达式语言,全称是ExpressionLang ...
- 【Cloud Foundry】Could Foundry学习(一)——Could Foundry浅谈
在阅读的过程中有不论什么问题.欢迎一起交流 邮箱:1494713801@qq.com QQ:1494713801 Cloud Foundry是VMware推出的业界第一个开源PaaS云平台.他包 ...
- ObjectiveC开发教程--字符串的连接
NSString *type = @"hello"; NSString *subtype = @"good"; NSString *typesub = [NSS ...
- vmware里面的linux怎么和windows相互传文件
我们常常遇到这样的问题.高版本号的vmware遇到低版本号的linux.使用起来就比較抠脚,比方低版本号的linux安装在高版本号的vmware里. 1.不能全屏显示虚拟机 2.每次切换出来.总要按一 ...
- 我所未知的 typeof 现象
一.一些基本使用测试 从上述可以看出: 1.判断一个 变量 是不是对象类型,不能只用 typeof 运算符: 2.它的返回值一直是一个字符串: 3.尽管 typeof null === 'object ...
- Android 自己定义UI圆角button
Android实际开发中我们一般须要圆角的button,普通情况下我们能够让美工做出来对应的button图片.然后放上去就可以,另外我们能够在布局文件里直接设置,也能够达到一样的效果. 以下解说在布局 ...
- 【转】获取Android控件的宽和高
我们都知道在onCreate()里面获取控件的高度是0,这是为什么呢?我们来看一下示例: 首先我们自己写一个控件,这个控件非常简单: public class MyImageView extends ...
- linux用户态和内核态通信之netlink机制【转】
本文转载自:http://blog.csdn.net/zcabcd123/article/details/8272360 这是一篇学习笔记,主要是对<Linux 系统内核空间与用户空间通信的实现 ...