欢迎光临散文网 会员登陆 & 注册

如何在 Minecraft 中加入元素视野效果(一)

2023-06-25 23:32 作者:蛋包饭里的饭  | 我要投稿


一、前言

最近在学 GLSL(OpenGL Shading Language)的相关知识,正巧 Minecraft 光影就是这方面的东西,所以准备动手制作了一个简单的光影,它能够像做到像原神的元素视野一样“扫描”场景中的事物。


由于 Minecraft 使用的渲染引擎,也就是 OpenGL 的版本十分老旧,在效率低下的同时,也对远古显卡拥有很好的兼容性。虽然其在快照版本 21w10a (1.17) 时更新到了 OpenGL 3.2 (2009),不过在此之前一直使用 OpenGL 2.1 (2006)。


如果有不对的地方,欢迎在评论区指出 ~

二、环境

准备好一个可以运行光影的 Minecraft 客户端,版本 20w22a (1.16) 及以上,因为在更新日志中有指出,深度缓冲区在此版本中加入,而扫描特效正好需要使用此缓冲区的数据。我并没有测试过低版本能否运行,所以这里为了保险起见建议使用新版本来开发。


准备一个光影加载器,像 Optifine 或者 Iris Shaders 之类的主流加载器一般都没问题。


在这里我使用了游戏版本 1.19.4 以及 Iris Shaders 1.6.4,因为 Iris Shaders 能够为用户输出光影包的错误信息,供开发者快速定位 bug 的位置,是我个人比较喜欢的一个 Mod。

正在加载的光影包出现了错误


三、创建

为了使客户端可以读取到我们的光影,需要进入其光影文件夹中,并在其中建立一个光影我们的光影包,它依然可以是一个文件夹,而并非需要像网上下载的那样压缩成 zip。这个光影包的名字是随意的,只要确保你准备的光影加载器能够读取到即可。

PS:如果你的文件管理能力比较强,也可以尝试在其他位置建立这样的一个包,并使用版本管理工具改善开发工作。

创建一个名为 MyShader 的光影包

进入我们创建好的光影包文件夹中,创建一个 shaders 文件夹,这里将是加载器加载的地方。在其中创建名为 final.vsh 与 final.fsh 的文件,作为接下来需要编写的顶点着色器(vertex shader)和片段着色器(fragment shader)。

两个 final 着色器文件


四、顶点着色器

Minecraft 光影首先会为画面上的多种物件进行分开渲染,如云朵、天空、方块、实体等,将使用不同的着色器代码进行先一步绘制,而最终所有物件将汇集到 final 着色器,进行最后的处理。要实现这个简单的光影,我们只需要用到 final 着色器即可。


首先打开创建好的 final.vsh 文件,在此着色器中,可以对当前颜色位置进行一些变换,由于原神中的场景扫描仅仅只是改变了画面的颜色,所以我们并不需要对位置做任何事情,只需要将当前位置传递到 fsh 着色器中即可。


在最开始写上 #version 120 表示该着色器将使用 GLSL 1.20 版本,接着创建一个二维向量 texCoord 用于将数据传递至 final.fsh 中,下方则是主要代码位置,写上 main 函数,写到这里我们已经不难看出,GLSL 的语法其实类似于耳熟能详的 c 语言。

使用 ftransform() 函数对内置变量 gl_Position 写入原本的数据,输出原本的位置信息,此时我们还需要将位置信息中的 x 与 y 写入 texCoord,用于下一个阶段的渲染。在着色器语法中,把需要用到的向量属性连起来写,如这里的 xy,将会转换为一个二维向量。


五、片段着色器

虽然这跟上一个着色器有着不一样的名称,但它们其实只是渲染的两个阶段,这些阶段都将在显卡处理器中运行,所以它们拥有相同的语法,以及不同的可使用数据。


首先我们编写一个最简单的例子,用于测试光影是否稳定运行。我们将需要的代码写上,一个 从上一阶段传递过来的变量 texCoord,一个二维纹理变量 gcolor,以及用于渲染的 main 函数。此时我们使用 texture2D 函数检索纹理 gcolor 在位置 texCoord 中的颜色,并把颜色中的 r 与 b 调换位置,此时我们将得到一个红色与蓝色调换的世界。

PS:如果不成功,请检查光影加载器提供的错误信息,并修复代码中的错误。

一个红色与蓝色调换的世界


如何在 Minecraft 中加入元素视野效果(一)的评论 (共 条)

分享到微博请遵守国家法律