前言
或许你可以从这个项目中体会到计算机图形学的乐趣
代码
视频
生肉:
熟肉:
技术分析
-
环境搭建与测试
- 首先,开发者设置了一个简单的“Hello World”程序来确保构建系统正确配置。
- 接着,他使用了一个叫做
gfw
的库来打开一个空白窗口,这个库处理了很多底层工作。
-
输入代码编写
- 开发者编写了用于键盘和鼠标输入的代码,以便在游戏中使用这些设备。
-
图形渲染
- 使用现代OpenGL进行渲染需要设置着色器和缓冲对象等组件,这通常是一个复杂的过程。
- 开发者成功地在屏幕的右上角渲染了一个绿色矩形,这是第一个方块的基础。
-
三维相机设置
- 为了能够看到3D视图中的方块,需要设置一个3D相机。
- 使用了一个名为
CGOM
的线性代数库来计算正确的相机矩阵。
-
纹理设置
- 游戏中的纹理被组织到一个大的图像文件中,称为“纹理集”(Texture Atlas),以提高效率。
- 开发者自己制作了一些像素艺术作为纹理,并将它们放入纹理集中。
- 渲染器通过获取方块纹理在纹理集中的偏移量,将其坐标映射到0到1的UV坐标空间中。
-
多块渲染
- 为了更高效地渲染多个方块,开发者采用了类似于《我的世界》中的“区块”(Chunk)系统,每个区块包含16×16×256个方块。
- 实现了优化,只渲染玩家能看到的方块表面,避免了不必要的内部面的渲染。
-
无限世界的实现
- 通过动态加载和卸载区块,实现了游戏世界的无限扩展。
- 当玩家移动时,远处的区块会被替换为靠近玩家的新区块。
-
不同类型的方块和世界生成
- 添加了多种类型的方块并实现了基本的世界生成算法。
-
方块破坏与放置
- 实现了方块破坏功能,通过从相机位置向世界投射射线来确定被击中的方块。
- 实现了方块放置功能,允许玩家在选定的方块面上放置新的方块。
-
地形生成
- 采用噪声函数来生成随机但平滑的高度图,进一步通过层叠噪声(Octave Noise)等技术生成有趣的地形特征。
- 跟随《我的世界》的经典做法,对噪声进行采样和分层。
-
光照与水的添加
- 虽然没有使用《我的世界》的真实光照系统,但通过为每个顶点添加额外的颜色信息来模拟简单的光照效果。
- 水的实现相对简单,选择一个特定的高度作为水面高度,低于该高度的部分填充为水。
-
透明度处理
- 在3D图形中实现透明度是一个复杂的问题。开发者将每个区块的网格分为不透明和透明部分,以便分别渲染。
- 为了获得良好的透明效果,需要按正确的顺序渲染透明物体。这意味着要从离玩家最远的物体开始渲染。
- 开始尝试了一些性能上的捷径,但最终决定采用正确的排序算法来解决透明物体的渲染问题。
- 为了减少性能影响,只在玩家移动时对附近的区块进行重新排序。