首先简单介绍一下 Minecraft 源码的获取方式. fabric 开发环境包含了反混淆 Minecraft 源码的工具, 因此最简单的方法是克隆一个 fabric mod 的仓库, 然后调用里面的工具. 考虑到我们的目的是修改 VulkanMod, 不妨直接 git clone https://github.com/xCollateral/VulkanMod.git (或克隆 fabric-example-mod 也可).

在获得了 VulkanMod 的代码仓库后, 在仓库文件夹内执行

1
./gradlew genSources
即可生成供 IDE 跳转的未混淆的源码包. 这一源码包的文件位置在VulkanMod/.gradle/loom-cache/1.18.2/下, 是一个包含了一大堆 .class 文件的 jar 包.

展开这个 jar 包(解压缩或者使用 jd-gui), 应当得到如下的目录树:

阅读全文 »

在我的 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 语言知识.

这是《如何编写OptiFine光影包》系列正文的第一篇. 本篇教程将搭建光影包编写的基本框架, 以接管 OptiFine/minecraft 自带的那些着色器, 将延迟着色真正地执行起来.

阅读全文 »

工欲善其事, 必先利其器. 私以为比起光影包的核心算法本身, 辅助性的代码以及工具代码是远为重要的. 好的工具集能帮助你快速定位 bug, 这在抓帧工具难以使用的情况下[1]是极其重要的. 本文主要介绍笔者在开发过程中产出的工具代码.

阅读全文 »

本文将首先简要回顾蒙特卡洛光线追踪算法, 随后概述 OptiFine 的工作方式, 对该算法在光影包中的实现难点进行分析, 最后对主流光线追踪光影包的实现原理进行解释.

阅读全文 »

作为一只晕 3D 症状日渐严重的 minecraft 玩家, 也许只有一个质量优秀的真实向光影包能救我狗命. 在换用了一个又一个光影包以尝试缓解症状后, 我意识到我可以比它们的作者中的绝大部分做得更好(当然不包括 SEUS PTGI. 它是当之无愧的标杆).

然而在开发过程中, 能用于参考的中文资料只有网络上的寥寥数篇入门级教程, 以及关于某些高质量光影包原理的只言片语. 为了不使来者陷入和我一样的境地, 特作此系列.

基于"进阶教程"的定位, 本教程假定读者具有基本的图形学知识, 了解光栅化渲染的流程, 掌握 glsl 浅显的运用, 具有大学本科范围内的线性代数和概率学知识. 前三者均可在这里学习.

本教程的目标是实现一个基于蒙特卡洛光线追踪且具有可用性能的 OptiFine 光影包.

预计本系列将在一年内完成. 标题致敬如何编写Shadersmod光影包系列.

About Me

计算机图(徒)形(刑)学爱好者

0%