如何在 Minecraft 中加入元素视野效果(二)
五、游戏处理
上一章中,我们实现了一个简单的光影,它可以将画面上的红色与蓝色互换。而为了实现这一效果,我们需要获取当前位置的颜色,并将颜色的 r 与 b 属性调换位置。
(相关资料图)
在 Minecraft 运行中,首先会在世界中生成大量的事物,其中有方块、动物、水流,玩家、甚至是天空,游戏程序决定了这些事物在世界中的位置、状态、是否可见等等。
除此之外,我们还需要让玩家进入此世界中,为此我们还应该将玩家的模型添加到世界。值得一提的是,在游戏编程中,为了让玩家看到画面,除了拥有模型以外,还需要一个摄像机,它将充当玩家的眼睛,用于作为观察世界的起点,通过设置摄像机的属性,来决定画面需要渲染哪些东西。
幸运的是,以上都已经由 Minecraft 实现,我们只需要关注其中画面的渲染。当游戏将世界处理好以后,游戏的图像数据将发送至显卡做进一步处理。
六、图形处理
当游戏处理完它负责的部分后,图形数据将发送至显卡。而在显卡中指挥工作的正是光影中包含的许多着色器程序。但是并不是全部,事实上还有某些预处理以及后处理工作已经由游戏引擎提供,我们需要编写的着色器仅仅是在过程之间的一个小步骤。
最终到达我们的第一个着色器(vsh)中的数据包含整个画面颜色的当前位置,另一个(fsh)则包含整个画面的颜色值。为了将每一个画面颜色都照顾到,这两个着色器将依次为每个颜色都运行一次。
在每次运行的过程中,我们可以简单取到当前处理所需的相关属性,比如从 gl_MultiTexCoord0 缓冲区中取当前颜色所在的坐标 xy,或者从 gcolor 缓冲区中取指定坐标位置的颜色。
当然,这里的坐标不是指游戏坐标,而是颜色在画面上的坐标,比如 (0, 0) 代表画面的左下角。
七、滤镜
在原神中开启元素视野时,画面将被加上一个特定的绿色滤镜,此时画面将变成偏暗的蓝绿色,并且有一条亮色带从玩家的位置开始一直移动至远方。这里我们可以把亮色带放一边,先试着将画面调成偏暗的蓝绿色。
对画面进行取色(不包括亮色带部分)可以大致得出,滤镜让红色取值大概在 [0, 45] 区间,由于颜色最大值为 255 ,简单起见,我们可以认为红色被对应缩放到 1/5,而其他两种颜色则是 1/2。
在着色器中的主函数加入代码,对相应颜色进行计算。由于 Minecraft 中的基础亮度与原神中有些许不同,我们可以对这个比值进行少许调整,将绿蓝的比值改为 7/10,以提高亮度,还原色彩差异。
如果你有足够的耐心,也可以一次一次修改,或者直接使用一个函数表达式,对色彩进行微调,以达到高度还原的效果。