到后面代码相对而言比较复杂了,因为没有系统的看红宝书(就跟字典一样,兴趣缺缺),很多操作的步骤比较迷糊。

  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小结的更多相关文章

  1. 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 ...

  2. OpenGL第12-14讲小结

    首先要为自己为什么没有写第10讲的控制3D场景和第11讲的红旗飘飘呢?因为没看啊~哈哈哈,而且我尝试着运行红旗飘飘的时候电脑蓝屏了(可能不是它的锅),暂时跳过了. 恩,12到14主要了解了这么些东西, ...

  3. 【23.26%】【codeforces 747D】Winter Is Coming

    time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...

  4. Python-基础-时间日期处理小结

    Python-基础-时间日期处理小结 涉及对象 1. datetime 2. timestamp 3. time tuple 4. string 5. date datetime基本操作 1. 获取当 ...

  5. 第23章 排序算法(包括merge等)

      第23章 排序算法  Sorting:1 sort Sort elements in range (function template)2 stable_sort Sort elements pr ...

  6. Python学习--23 第三方库

    本文将介绍python里常用的模块.如未特殊说明,所有示例均以python3.4为例: $ python -V Python 3.4.3 网络请求 urllib urllib提供了一系列用于操作URL ...

  7. 23.Mysql应用优化

    23.应用优化23.1 使用连接池应用启动时创建好连接,以供用户使用,而不是每次创建. 23.2 减少对Mysql的访问 23.2.1 避免对同一数据做重复检索合并简单查询,减少访问次数. 23.2. ...

  8. Python学习--23 内建模块及第三方库

    本文将介绍python里常用的模块.如未特殊说明,所有示例均以python3.4为例: $ python -V Python 3.4.3 网络请求 urllib urllib提供了一系列用于操作URL ...

  9. oracle 使用db_link 导入导出小结

    客户有一个需求,是将一个库中的某个用户迁移到一台新的oracle服务器上,因数据量较小,并且不涉及版本的升级,所以可以采用创建一个dblink,然后通过这个dblink直接从源库将用户数据导出并导入到 ...

  10. netty源码解解析(4.0)-23 ByteBuf内存管理:分配和释放

    ByteBuf内存分配和释放由具体实现负责,抽象类型只定义的内存分配和释放的时机. 内存分配分两个阶段: 第一阶段,初始化时分配内存.第二阶段: 内存不够用时分配新的内存.ByteBuf抽象层没有定义 ...

随机推荐

  1. poj——1330 Nearest Common Ancestors

    Nearest Common Ancestors Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 30082   Accept ...

  2. W3School Memcached教程(安装/基本操作/高级操作/命令)

    来自W3School的Memcached教程,基本上涵盖了从安装到状态监控的教程. 不过最全的应该是官方提供在GitHub上的Wiki教程,一切的标准都来自官方,参考:https://github.c ...

  3. Android Studio Module 的添加与删除

    1. 添加Module(此时可以字面翻译为“模块”,意译为“其他工程”) 2. 删除Module 你要知道,Android Studio的非人性设计,导致删除一个module都是繁琐的. 当你想在An ...

  4. NetCore实现全局异常捕捉统一处理

    做net项目时候,在Global.asax文件中可以通过Application_Error方法全局捕获异常并处理后统一跳转到自定义的错误页面. 下面是我个人在NetCore项目中实现全局捕获异常并统一 ...

  5. PHP第五课 自己主动类型转换与流程控制

    学习概要: 1.了解自己主动类型转换的有哪些 2.了解主要的流程控制语句 3.实例:实现日历表格的写法 自己主动类型转换 1)整型转字符串 echo $num."abc"; 2)字 ...

  6. 高效开发之SASS篇 灵异留白事件——图片下方无故留白 你会用::before、::after吗 link 与 @import之对比 学习前端前必知的——HTTP协议详解 深入了解——CSS3新增属性 菜鸟进阶——grunt $(#form :input)与$(#form input)的区别

    高效开发之SASS篇   作为通往前端大神之路的普通的一只学鸟,最近接触了一样稍微高逼格一点的神器,特与大家分享~ 他是谁? 作为前端开发人员,你肯定对css很熟悉,但是你知道css可以自定义吗?大家 ...

  7. C#之选择排序

    算法描述 1.假定未排序序列中第一位为数组最小值,通过与后面的数值进行比较,找到未排序序列中最小值,与未排序序列第一位交换位置: 2.重复步骤一,对剩余未排序序列进行比较找出最小值,与未排序序列中第一 ...

  8. java线程和线程池的使用

    java线程和线程池 一.创建多线程的方式 java多线程非经常见.怎样使用多线程,怎样创建线程.java中有两种方式,第一种是让自己的类实现Runnable接口.另外一种是让自己的类继承Thread ...

  9. TomCatserver的安装,环境的配置,服务的启动以及验证---ShinePans

    首先下载 TomCat 6: http://yunpan.cn/cg5icf3dha4k3  提取码 34c5 然后配置环境变量: 电脑>>>属性>>>高级系统设置 ...

  10. 使用JavaScript开发IE浏览器本地插件实例

    使用JavaScript开发IE浏览器本地插件实例 投稿:junjie 字体:[增加 减小] 类型:转载 时间:2015-02-18我要评论 这篇文章主要介绍了使用JavaScript开发IE浏览器本 ...