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抽象层没有定义 ...
随机推荐
- 夜话JAVA设计模式之代理模式(Proxy)
代理模式定义:为另一个对象提供一个替身或者占位符以控制对这个对象的访问.---<Head First 设计模式> 代理模式换句话说就是给某一个对象创建一个代理对象,由这个代理对象控制对原对 ...
- 16、Java并发性和多线程-死锁
以下内容转自http://ifeve.com/deadlock/: 死锁是两个或更多线程阻塞着等待其它处于死锁状态的线程所持有的锁.死锁通常发生在多个线程同时但以不同的顺序请求同一组锁的时候. 例如, ...
- SQL SERVE BASE
http://www.cnblogs.com/chillsrc/category/49632.html
- 安全简单解决MVC 提示 检测到有潜在危险的 Request.Form 值.
一般使用富文本编辑器的时候.提交的表单中包含HTML字符,就会出现此错误提示. 使用 ValidateInput(false) 特性标签并不能解决此问题. 网上前篇一律的回答是修改Web.Config ...
- Redis是单线程的
Redis是单线程的 学习了: http://blog.csdn.net/liupeng_qwert/article/details/77263187 https://www.cnblogs.com/ ...
- TI C66x DSP 系统events及其应用 - 5.11(中断控制寄存器)
C66x DSP运行中断的简要流程: 1.使能了全局中断和子中断.假设硬件检測到中断发生,那么CPU就要跳转. 2.软件把CPU内部的A,B类寄存器的值等推入堆栈保存,把当前PC寄存器的值放入IRP寄 ...
- DetachedCriteria的使用
设计上能够灵活的依据 Criteria 的特点来方便地进行查询条件的组装.如今对 Hibernate的Criteria 的使用方法进行总结: Hibernate 设计了 CriteriaSpec ...
- C# Json反序列化 C# 实现表单的自动化测试<通过程序控制一个网页> 验证码处理类:UnCodebase.cs + BauDuAi 读取验证码的值(并非好的解决方案) 大话设计模式:原型模式 C# 深浅复制 MemberwiseClone
C# Json反序列化 Json反序列化有两种方式[本人],一种是生成实体的,方便处理大量数据,复杂度稍高,一种是用匿名类写,方便读取数据,较为简单. 使用了Newtonsoft.Json,可以自 ...
- C#之快速排序
算法描述 1.假定数组首位元素为“枢轴”,设定数列首位(begin)与末位(end)索引: 2.由末位索引对应元素与“枢轴”进行比较,如果末位索引对应元素大于“枢轴”元素,对末位索引减一(end--) ...
- CentOS6.5配置代理上网
虚拟机vmWare下装了个CentOS,第一件事是配置代理上网,因为工作环境需要使用代理上网,但发觉与uBuntu不同,根本没有什么/etc/environment. 在网上疯狂搜索,都说要配置/et ...