着色器 基本概念

参阅:渲染模组和引擎

过时的文档

这篇文档在 新版文档open in new window 中有修改,此处仅为旧版留档。

何谓着色器?

对于一个完整的现代图形应用程序(基于如 OpenGL、Vulkan、DirectX 等图形库)来说,着色器是它渲染场景的手段。
我们知道图形应用程序的目的是读取模型文件或硬编码几何体,并在屏幕上绘制。着色器就描述了我们传入的几何体在屏幕上的何种位置何种方式绘制。

光影是着色器的集合。

渲染模组/引擎如何帮助光影和游戏交流

渲染模组/引擎(下简称渲染模组)充当了游戏和光影的桥梁。由于原版所提供的信息极其有限(许多效果必须的变量没有直接提供),如果想仅利用原版资源包的着色器来编写光影,无异于自讨苦吃。
渲染模组利用模组加载器提供的 接口 或直接对 Minecraft 源代码进行逆向工程并注入,接管了 Minecraft 的原版渲染管线,并提供了大量信息和更多 缓冲区 ,为光影开发提供便利。

一些渲染模组还修改了原本所使用的图形库,将 OpenGL 替换为了 Vulkan,如 Vulkanite

场景在着色器中发生了什么?

光影通常以多个着色器组成,着色器接收渲染模组提供的各种变量,以及先前乃至上一帧计算好的存入缓冲区的信息,按照程序进行计算后输出到指定的缓冲区。
不同渲染模组的工作原理不尽相同,所对应的光影包规格也有所区别。

一个着色器中又可以细分为多个阶段,也就是我们常说的顶点着色器、像素着色器等,这里按照通常管线的顺序,简单列举一下每种着色器计算的对象:

  • 顶点着色器Vertex Shader,它的主要职责是变换坐标,包括顶点坐标、纹理坐标等,也可以处理顶点的颜色,计算对象为每一个顶点。
  • 几何着色器Geometry Shader,这个阶段是可选的,它的主要职责是生成新的顶点,计算对象是每个图元,可以通过特定的索引值确定需要处理的顶点。

    图元通常为点(一个顶点)、线条(两个顶点)或三角形(三个顶点)

  • 片段着色器Fragment Shader,根据它所计算的对象,我们也将其称为像素着色器。它的计算对象是每一个像素。
  • 计算着色器Compute Shader,这个阶段是可选的,它负责进行抽象计算,可以存取任意的 缓冲区 ,但是不能传入自定义变量,也没有默认输出。

当仅考虑顶点着色器和像素着色器时,在 上文 中我们所提到的所谓“何种位置”大多数时候就在顶点着色器中进行处理,而以“何种方式”则是顶点着色器和像素着色器的共同作用。

2018 年英伟达提出了 网格着色器(Mesh shader)open in new window,这让着色器不再拘泥于上述顺序,拥有更强的可编程性和性能。

渲染龙和它光影朋友们的爱恨纠葛

最早的基岩版光影基于 OpenGL ES 的 GLSL 或 DirectX 的 HLSL Windows/XBox 。由于接口限制,基岩版光影可以实现的效果非常少(甚至比 JE 1.16 之后的原版资源包着色器还少),并且为 向前渲染管线 ,但仍可以通过一系列奇技淫巧实现基于物理的渲染。

然而在渲染龙实装后很长一段时间里,光影作者们都面临着各种问题:

  • 渲染龙已覆盖到了各种 PC、移动设备及主机的基岩版上,替代了原本的渲染方案,而基于原始方案的第三方着色器也受到了牵连,直接导致了第三方光影集体灭绝。
    • 理想情况下,Windows 版本能够通过其调用 RTX 2000 Nvidia 或 RX 6000 AMD 系列及以上显卡的光线追踪加速单元以提升光线追踪的效率,而其他平台上其则能够起到优化作用。

    意外的是,渲染龙一开始是给 Java 版设计的,而目前只在基岩版中起到了负优化作用。XBox 版本在渲染龙推出之初就已经有带有光线追踪的预览版,而在这之后也被移除了。

  • 渲染龙的算法加密破坏了很多东西,除了光影还有例如区块显示红石能量显示亮度显示夜视透视小地图这些原本都能由第三方光影实现的功能。而它们的消失给一些玩家带来了不少困扰。
  • 官方光追虽然在准确性上力压 Java 版一头,但其主要得益于 DirectX RayTracing,在代码质量和细节调校上做的并不尽如人意,也对主打写实风格的地图与纹理创作者造成了很大困扰。

官方光追很大一部分是实习生面向论坛编程的产物,其代码质量极其低下。五星创作家茶匙对此评价到:英伟达这样写着色器代码,怕是脸都不要了。

这些也是渲染龙在开发者群体内风评不佳的原因。

在此之后,渲染龙虽被成功破解,但由于破解团队收到微软的 DMCA 致函,以及新的光影编写方法过于麻烦,基岩版光影仍然沉寂。

  • DMCA 致函是一种版权警告,当时团队将代码上传到了 Github,被致函删库。
  • 当时编写光影需反编译游戏后进行编辑,再将特定文件回编译并放到固定文件夹替换相关文件,然后重启游戏。

不过事情在 2023 年迎来了转机。基岩版在这年 7 月发布了 延迟渲染 更新,提供了各种接口和信息。久旱逢甘霖,基岩版光影自此开始进入了新的时代。

网易的延迟处理接口来得要比渲染龙更早,自由度也相对当时的渲染龙更高,在很长一段时间里,网易版的光影繁荣程度一度超过了国际版。


扩展阅读: