现在我们有一个有点希奇的淡入淡出结果,这个机制是后来加上的,当时是出于一个人的想法,想让画面从 Windows 桌面上淡入淡出,我们也没特别的理由,就是觉得可以做一下,于是就实现了这个结果。
现在的逻辑是,画面可以实现双向的淡入淡出,比如启动时从黑屏淡入,退出时再淡出回到桌面。这个结果其实不是直接在主窗口上做的,我们实际上是创建了一个专门用于淡入淡出的窗口,它的唯一作用就是把整个屏幕盖住,用黑色举行淡入淡出处理。
而真正用来渲染游戏内容的窗口是另一个,我们创建这个窗口时,让它的尺寸和整个屏幕一样大,也就是说它占满了全屏,但一开始是不可见的。等准备好后,我们再把这个窗口设置为可见状态,然后通过 BitBlt(图像块传输)等方式将画面绘制到这个窗口中,从而实现游戏画面的表现。
以是,如果我们之后还需要对这个表现流程做调整,比如修改启动流程或添加更多的渲染逻辑,就需要注意我们现在是用了两个窗口:一个用于处理淡入淡出的视觉结果,另一个是实际负责表现游戏内容的主窗口。这个计划使得我们可以把视觉过渡和实际游戏逻辑解耦,方便管理和优化。
为 OpenGL 设置环境
我们接下来无论是使用 OpenGL 照旧 Direct3D,都需要做一些额外的准备工作,才气让 Windows 系统知道我们将要使用 3D 图形硬件举行渲染。
第一步其实相对简单,就是在项目中链接符合的系统库。之前我们已经做过类似的事变,比如列出我们所依赖的 Windows 系统服务。需要明确一点,这些库并不是我们平常所明白的那种“包含实际函数实现的库”,而是“导入库(import libraries)”。这些导入库的作用是资助我们毗连到操作系统提供的功能接口上。
举例来说:
user32.lib 里面包含的是窗口相关的服务,例如 CreateWindow 这样的函数;
gdi32.lib 提供图形界面相关的一些基础功能,比如 GetDeviceCaps 等;
winmm.lib 则是我们用来设置定时器分辨率的,这个用于调整窗口调度系统的精度。
到现在为止,我们的步伐中只用了这些库,也仅仅调用了一些基础的窗口和定时器相关功能。
但接下来我们要和 3D 图形硬件打交道,而这些功能并不包含在前面这三个库中。因为我们运行在 Windows 平台上,不可能直接越过操作系统去访问显卡硬件,必须通过系统提供的接口来操作。
以是,接下来的任务就是:
性能提升:即使使用 Z 缓冲区,通过前到后的绘制次序可以优化渲染过程。在绘制时,可以使用早期的 Z 测试(early Z),跳过那些已经被遮挡的物体,从而节省 GPU 的计算资源,进步渲染速度。
此外,不使用 Z 缓冲区还能节省带宽,因为没有必要举行 Z 缓冲区的读写操作,从而减少内存访问的开销。不过,即使如此,仍然有可能开启 Z 缓冲区来使用早期遮挡检测(early occlusion),进一步优化性能。
总的来说,虽然在某些环境下可以不使用 Z 缓冲区,但在渲染透明物体时,排序 Z 缓冲区仍然黑白常重要的,且能带来性能的提升。
抱歉!看起来 OpenGL 文档又在哄人
OpenGL 的文档好像经常禁绝确,已经多次验证了这一点。尽管文档中有很多形貌,但在实际应用中,碰到的环境常常与文档所说的不一致,这让办理问题变得更加困难。
你会使用多个 OpenGL 版本,照旧只用最小的版本以兼容一般的 Windows XP 机器?(大多数机器上用的是什么版本?)
思量到目标平台为较老的 Windows XP 系统,选择符合的 OpenGL 版本是关键。由于我们开辟的是一款 2D 游戏,并不需要太多扩展功能,因此可以选择一个公道的 OpenGL 版本,乃至可能仅使用 OpenGL 2.0,这样就能满足大部分需求,同时保持系统的轻量化。总体来说,尽量保持最小化,避免引入不必要的复杂功能,因为对于这个项目而言,并不需要太多额外的 OpenGL 功能。
对于像这样的游戏,使用 OpenGL 的新版本会有什么好处吗?