48小时用C实现简单MC游戏

前言

或许你可以从这个项目中体会到计算机图形学的乐趣 :grinning:

代码

视频

生肉:

熟肉:

技术分析

  1. 环境搭建与测试

    • 首先,开发者设置了一个简单的“Hello World”程序来确保构建系统正确配置。
    • 接着,他使用了一个叫做 gfw 的库来打开一个空白窗口,这个库处理了很多底层工作。
  2. 输入代码编写

    • 开发者编写了用于键盘和鼠标输入的代码,以便在游戏中使用这些设备。
  3. 图形渲染

    • 使用现代OpenGL进行渲染需要设置着色器和缓冲对象等组件,这通常是一个复杂的过程。
    • 开发者成功地在屏幕的右上角渲染了一个绿色矩形,这是第一个方块的基础。
  4. 三维相机设置

    • 为了能够看到3D视图中的方块,需要设置一个3D相机。
    • 使用了一个名为 CGOM 的线性代数库来计算正确的相机矩阵。
  5. 纹理设置

    • 游戏中的纹理被组织到一个大的图像文件中,称为“纹理集”(Texture Atlas),以提高效率。
    • 开发者自己制作了一些像素艺术作为纹理,并将它们放入纹理集中。
    • 渲染器通过获取方块纹理在纹理集中的偏移量,将其坐标映射到0到1的UV坐标空间中。
  6. 多块渲染

    • 为了更高效地渲染多个方块,开发者采用了类似于《我的世界》中的“区块”(Chunk)系统,每个区块包含16×16×256个方块。
    • 实现了优化,只渲染玩家能看到的方块表面,避免了不必要的内部面的渲染。
  7. 无限世界的实现

    • 通过动态加载和卸载区块,实现了游戏世界的无限扩展。
    • 当玩家移动时,远处的区块会被替换为靠近玩家的新区块。
  8. 不同类型的方块和世界生成

    • 添加了多种类型的方块并实现了基本的世界生成算法。
  9. 方块破坏与放置

    • 实现了方块破坏功能,通过从相机位置向世界投射射线来确定被击中的方块。
    • 实现了方块放置功能,允许玩家在选定的方块面上放置新的方块。
  10. 地形生成

    • 采用噪声函数来生成随机但平滑的高度图,进一步通过层叠噪声(Octave Noise)等技术生成有趣的地形特征。
    • 跟随《我的世界》的经典做法,对噪声进行采样和分层。
  11. 光照与水的添加

    • 虽然没有使用《我的世界》的真实光照系统,但通过为每个顶点添加额外的颜色信息来模拟简单的光照效果。
    • 水的实现相对简单,选择一个特定的高度作为水面高度,低于该高度的部分填充为水。
  12. 透明度处理

    • 在3D图形中实现透明度是一个复杂的问题。开发者将每个区块的网格分为不透明和透明部分,以便分别渲染。
    • 为了获得良好的透明效果,需要按正确的顺序渲染透明物体。这意味着要从离玩家最远的物体开始渲染。
    • 开始尝试了一些性能上的捷径,但最终决定采用正确的排序算法来解决透明物体的渲染问题。
    • 为了减少性能影响,只在玩家移动时对附近的区块进行重新排序。