【openGL2021版】天空盒
【openGL2021版】天空盒
大家好,我是Lampard猿奋~
欢迎来到船新的openGL基础系列的博客,今天主要实现的是天空盒
(1)什么是天空盒
上周我们已经实现了FPS式的摄像机控制,键盘的“WSAD”可以控制摄像头的前后左右移动,鼠标右键可以控制摄像头旋转
接下来就是要丰富一下蓝蓝的背景,给背景加上一个天空盒 。那什么是天空盒呢?
在实时渲染中,如果要绘制非常远的物体,例如远处的山、天空等,随着观察者的距离的移动,这个物体的大小是几乎没有什么变化的。而实现这种“无穷远”的背景技术就是天空盒技术
而天空盒的实现也非常简单,其实就是将一个立方体展开,然后在六个面上贴上相应的贴图,如上图所示
(2)引入第三方图片解析库soil
说到图片解析库我可是有莫名的熟悉感,早些日子的时候接触到python的Image帮助我实现了制作GIF的需求
现在在openGL上我们同样需要一个图片解析库去帮助我去解析制作天空盒所需的纹理资源
(1)下载SOIL库链接到项目中
首先需要网上下载SOIL库的头文件和lib库(文末也会提供下载链接),在代码中连接进来然后重新编译一下,没有报错就OK,如果有报错可能还是需要去官网下载一个符合自身VS版本的
(2)利用SOIL_load_OGL_texture方法解码纹理
紧接着我们就可以用soil库中的SOIL_load_OGL_texture方法去帮助我们去解码纹理并返回一个openGL的纹理ID,这个方法有四个参数,分别对应的意思是文件名,文件格式,老的纹理ID和一个解码模式
其中间两个参数填0是默认模式,然后最后一个参数我们选SOIL_FLAG_POWER_OF_TWO.现在我们就可以重写纹理类的Init方法了,我还留了一个参数invertY来决定是否翻转我们的纹理(因为有时候解出来的纹理会上下颠倒)
编译一下,显示正确,我们接着往下做
(3)缓存纹理对象
从天空盒开始之后就会用到很多很多的纹理资源,不可能说每一个纹理对象都用到的时候创建,对于创建过的纹理资源我们模仿cocos中的纹理缓冲区,以键值对的形式来缓存我们的纹理对象
我们用LoadTexture方法来加载纹理资源,如果map中没有该纹理路径的键则创建一个新的纹理对象,并以纹理路径为键缓存,否则则直接返回这个纹理对象。最后在main文件中修改一下纹理对象创建的方式即可
(3)创建天空盒类
纹理解析完之后,我们就可以大胆的创建我们的天空盒了。如上文所说,天空盒其实就是一个“无穷远”的立方体,所以我们给天空盒定义前后左右上下六个纹理对象的成员变量,以及一个初始化函数和一个绘制函数
(1)Init天空盒初始化方法
有了纹理对象的加载方法,那加载函数就简单了,我们就只需要分别对六个纹理对象初始化一遍就行
(2)什么是无穷远?
一个矩形图片我们可以用之前学习的glBegin(GL_QUADS)来绘制,但是问题是在于多远是无穷远呢?如果绘制的物体比这个天空盒还远,那不就穿帮出bug了吗?
此时就需要理解深度缓冲的概念了,当openGL深度缓冲开启的时候,每一个位置会记录当前位置上深度优先级最高的像素点的颜色(有点像我们的ZOrder?),这个优先级取值是0-1之间,约靠近0优先级越高。当我们关闭深度缓冲的时候,绘制的内容就是取优先级最低的情况,所以我们绘制天空盒之前需要关闭深度缓冲,绘制物体的时候再重新开启就可以保证绘制的物体在天空盒之前
但是还有一个问题,如果写死天空盒的位置,有了深度缓冲的概念,其他物体是出不去了,但是我摄像头移动,我玩家直接出去了不也是一个bug吗?
这是我们只要把摄像机当前的xyz传递过来,绘制前对天空盒作一个glTranslatef就好啦,下面展示了前纹理的绘制其余的五个面也是同样的做法即可
(3)展示效果
前期准备完成,然后我们就在main方法中创建一个摄像头,然后在绘制的函数中同时绘制天空盒即可
最后看看我们的效果,可以看到无论摄影机怎么变都逃不出天空盒
附soli库下载路径:
好啦今天就到这里
点赞,关注!!!
【openGL2021版】天空盒相关推荐
- 【openGL2021版】粒子系统(全)
[openGL2021版]粒子系统(全) 大家好,我是Lampard猿奋~ 欢迎来到船新的openGL基础系列的博客,今天主要实现的是粒子系统 (一)上周demo回顾 上周实 ...
- 【openGL2021版】纹理贴图
[openGL2021版]纹理贴图 大家好,我是Lampard猿奋~ 欢迎来到船新的openGL基础系列的博客,今天学习的是纹理贴图 (一)回顾 上周我们学习了 ...
- 【openGL2021版】obj格式文件
[openGL2021版]obj格式文件 大家好,我是Lampard猿奋~ 欢迎来到船新的openGL基础系列的博客,今天学习的是obj格式文件 (一)什么是obj格式文件 ...
- 【openGL2021版】阶段展示
[openGL2021版]阶段展示 大家好,我是Lampard猿奋~ 欢迎来到船新的openGL基础系列的博客,今天主要是展示这一个多月来的学习成果 (1)镜面光斑 上周我们 ...
- 【openGL2021版】固定管线光照
[openGL2021版]固定管线光照 大家好,我是Lampard猿奋~ 欢迎来到船新的openGL基础系列的博客,今天记录的是固定管线的光照 (一)光学模型 通常物体表面的 ...
- 【Unity入门】3.3D物体
[Unity入门]3D物体 大家好,我是Lampard~~ 欢迎来到Unity入门系列博客,所学知识来自B站阿发老师~感谢 (一)物体移动旋转缩放 (1)物体移动 在上一篇文章 ...
- 【游戏客户端】实现刮刮乐效果
[游戏客户端]实现刮刮乐效果 之前的博客中,我和大家分享了如何做: 商业化的充值活动 :[商业化充值活动博客] 抽卡系统:[抽奖,抽卡系统博客] 装备系统:[装备系统博客] 红点系统:[红 ...
- 在Excel中更改默认图表类型
On July 25th I announced a giveaway for Jon Peltier's amazing Chart Utility, and thanks for all the ...
- unity制作滚动的天空简易版(在b站学的,此处总结,供学习)
学习于:程序员咖啡吧(B站up) 程序员咖啡吧的个人空间_哔哩哔哩_bilibili unity不是中文版没关系一样的. 欢迎大佬指教,我要复习去了 话不多说先了解游戏分为几个部分: 人物,摄像头,环 ...
- Cocos2dx版本介绍【至3.10版】
Cocos Studio升级为Cocos.更优秀的产品.更优质的服务. 1. 游戏开发一站式解决方案,低成本.高效率 2. 高性能,一次制作,多终端平台共享 3. Windows与Mac同步 ...
最新文章
- oracle grand select,Oracle SQL 高级篇
- ffmpeg + opencv 实现视频播放器(没有声音)
- div 自动换行_js自动打字--autotypejs
- Spring 5.0 源码编译, 403, 404 依赖pom 无法下载问题
- 我看百度和Google
- boost::mp11::mp_reverse_fold_q相关用法的测试程序
- 夺命雷公狗---PHP开发APP接口---1(手动编写json)
- ASP.NET MVC学习之(5):Html.ActionLink
- 如何在电脑上截屏_如何在电脑上截图?教你6种常用的截图方法,总有你不知道的...
- 数据异常HTML,@ Html.DropDownListFor的数据绑定异常
- 疫情之下 SaaS 市场两极分化,SaaS 厂商如何突围严峻形势?
- linux查看tomcat安装路径
- java带参数的方法笔记_Java学习笔记十一:Java中的方法
- 王者荣耀用java_怎样用Java的方式打开王者荣耀
- 制作ESXi6.5启动盘
- 密码学工具箱ToolsFx发布日志
- cocos 节点坐标和世界坐标转换 个人理解与应用
- flink watermark 生成机制与总结
- Ubuntu19下隐藏桌面图标
- robotframework 图片校验