Minecraft渲染原理(序)

在我的 OptiFine 光影包开发到具有基本的功能时, 我意识到了一件事情:

越是优化光线追踪性能, 就越会发现光影包的能力是有极限的.....

我不做光影包了, JOJO!

具体说来, 要使非方块形的 Minecraft 物体能正确地影响全局光照, 光线追踪光影包就不得不将这些物体的形状硬编码到代码中, 例如PTGI GFME. 这带来性能的降低(包括编译着色器的性能和渲染的性能)、编码的繁琐和程序员心情的烦躁; 在 Minecraft 发布新版本时, 也需要不断的维护才能保持正确性.

然而, 光线追踪硬件的出现带来了另一种可能性. 光线追踪硬件能以高得多的性能进行光线与场景的遍历求交, 场景也不局限于体素世界, 而驱动程序实现的加速结构构建更能将我们从手工实现求交算法、维护体素结构的工作中解放出来; 但这一功能只能在 Vulkan 等 OpenGL 以外的现代图形 API 中使用. 如果能将基于硬件的光线追踪引入 Minecraft 的图形系统中, 结果将是相当令人期待的.

VulkanMod 是一个力图将 Vulkan 带入 Minecraft 中的 mod, 目前已有一定可用性, 但尚处于 pre-Alpha 阶段, 具体的光线追踪功能只能由我们自己来实现. 如果能在 VulkanMod 的基础上进行修改, 毫无疑问将为我们节省大量的时间.

对这一 mod 进行修改的前提是我们对 Minecraft 的渲染系统有一定的认识. 然而, 互联网上似乎少有对这部分源码的介绍. 作为笔者阅读源码的笔记, 本系列试图提供 Minecraft 的渲染系统的一个清晰的图景, 以备笔者自己和读者查阅. 然而由于笔者水平所限, 目前写出的部分必然是流水账.

本系列使用的 Minecraft 版本是 1.18.2. 期望读者具有基本的 OpenGL 基础和 java 语言知识.