跳到主要内容
专有名词

本文涉及到的专有名词:光影Mod

什么是图形渲染器?

渲染器是什么?

渲染器(Renderer)是负责把 3D 数据变成 2D 画面的程序。它接收场景数据(模型、材质、光照、相机),输出最终显示在屏幕上的像素。

打个比方:你是个导演,要拍一部电影。你给摄影师(渲染器)一份剧本(场景数据:演员站位、灯光、镜头角度),摄影师拍出画面(像素)给你。渲染器就是「画面的摄影师」。

具体到 Minecraft:

  • 场景数据:方块、生物、玩家位置、光照、视角。
  • 渲染器:负责把这些数据画成画面。
  • 输出:屏幕上看到的方块世界。

渲染器 = 图形 API + 自定义 GLSL

这是渲染器的核心公式。意思是:一个完整的渲染器,由两部分组成

  1. 图形 API:负责和 GPU 对话的底层接口(OpenGL、Vulkan、DirectX 等,上一篇讲过)。
  2. 自定义 GLSL:负责具体画图逻辑的着色器代码(GLSL 是 OpenGL 的着色器语言)。

打个比方:

  • 图形 API 是「画笔和画布」——它提供工具,但不告诉你怎么画。
  • GLSL 是「画法」——具体怎么调色、怎么打光、怎么处理材质。
  • 渲染器 = 画笔画布 + 画法 = 一幅完整的画。

光有图形 API 不够,因为 API 只能画三角形、设颜色,画不出 Minecraft 那种方块风格、光影效果。要写出 GLSL 着色器,告诉 GPU「这个方块怎么画、光怎么打、阴影怎么算」,才能渲染出 Minecraft 的画面。

什么是 GLSL?

GLSL 全称 OpenGL Shading Language,中文「OpenGL 着色语言」。它是 OpenGL 用的编程语言,专门写给 GPU 跑的。

名词解释

着色器(Shader):一段写给 GPU 跑的程序,负责决定每个像素、每个顶点怎么画。着色器用 GLSL(OpenGL)、HLSL(DirectX)、MSL(Metal)等语言写。

GLSL 程序分两类:

1. 顶点着色器(Vertex Shader)

负责处理顶点(3D 模型的角点)。它接收顶点的位置、颜色、纹理坐标,输出顶点在屏幕上的最终位置。简单说:决定每个点画在屏幕哪里

2. 片段着色器(Fragment Shader)

负责处理像素(屏幕上的点)。它接收顶点着色器的输出,决定每个像素的最终颜色。简单说:决定每个点是什么颜色

3. 几何着色器(Geometry Shader)

可选的着色器阶段,运行在顶点着色器和片段着色器之间。它可以接收一个或多个顶点组成的图元(如点、线、三角形),并能够生成新的图元,从而实现一些高级效果,如动态粒子系统、阴影体生成等

现代图形 API 中的其他着色器类型

在更现代的 OpenGL(以及 Vulkan、DirectX 12)中,还存在其他类型的着色器:

  • 曲面细分着色器:用于动态细分几何体,增加模型细节,实现平滑曲面。
  • 计算着色器:用于通用计算,不直接参与图形渲染管线,可用于物理模拟、图像处理等任务。

但 Minecraft 原版及大多数光影包主要使用顶点着色器和片段着色器。

举例:画一个方块,顶点着色器决定方块的 8 个角点在屏幕哪里,片段着色器决定方块表面每个像素是泥土色、草色还是石头色。

为什么 Minecraft 的渲染器在不断演进与替换?

提到“换渲染器”,其实在 Minecraft 的语境下包含官方演进社区替换两个层面的动作:

1. 官方层面(Mojang 的底层重构)

Mojang 其实一直在迭代 Java 版的渲染引擎。为了提升性能和支撑新特性,官方在 1.17 版本进行了大修,引入了全新的底层渲染引擎 Blaze3D,重写了大量图形渲染逻辑。

但出于 Java 版跨平台兼容性的考量,Mojang 始终坚守 OpenGL 作为图形 API,且官方内置的 GLSL 着色器非常基础,只为保证游戏能正常运行,画面表现相对朴素。

2. 社区层面(玩家与 Mod 开发者的替换)

虽然官方进行了重构,但玩家对极致性能电影级画质的追求是无止境的。官方保守的策略无法满足这些个性化需求,于是社区选择通过第三方模组来直接“替换”掉原版的渲染逻辑。这又分为两个方向:

  • 为了画质(换 GLSL 着色器): 玩家觉得原版画面太素,想要真实的光影、阴影、反射。于是出现了光影包(Shader Packs,如 BSLContinuum)。光影包本质上就是一套用 GLSL 编写的自定义着色器代码集合,它替换了原版的简单着色器,把画面从「方块像素风」变成了「电影级真实感」。为了加载这些光影,社区开发了 OptiFineIris 等光影加载器。

  • 为了性能(换图形 API 或重写逻辑): 原版 OpenGL 的 CPU 开销较大,老旧设备容易卡顿。于是社区开发了 Sodium(用现代 OpenGL 重写渲染逻辑,大幅提升帧率),甚至出现了 VulkanMod(直接把图形 API 从 OpenGL 替换为 Vulkan,以降低 CPU 开销)。

Minecraft 主流渲染器 / 优化 mod

1. 原版渲染器

  • 用 OpenGL + Mojang 写的 GLSL。
  • 性能一般,画面朴素。

2. OptiFine

  • 优化原版渲染器,提升帧率。
  • 支持光影包(Shader Packs),换 GLSL 实现真实光影。
  • 老牌,但更新慢,和 绝大部分MOD 不兼容。

3. Iris Shaders

  • 新一代光影 mod,和 Sodium 兼容。
  • 性能比 OptiFine 好。
  • 支持主流光影包(BSL、Continuum、SEUS 等)。

4. Sodium

  • 用现代 OpenGL + 优化算法,大幅提升帧率(2–7 倍)。
  • 不加光影,只优化。
  • 是 Fabric mod,和 Iris 配合用。

5. VulkanMod

  • 把 Minecraft 的图形 API 从 OpenGL 换成 Vulkan
  • 性能更好(理论上),但兼容性差,部分 mod 不支持。
  • 实验性项目。

6. Canvas Renderer

  • 一个新的渲染框架,支持自定义着色器。
  • 兼容 Fabric,和 Sodium 配合。

渲染器和图形 API 的关系

回顾公式:渲染器 = 图形 API + 自定义 GLSL

渲染器图形 APIGLSL
Minecraft 原版OpenGLMojang 写的简单着色器
OptiFineOpenGLOptiFine 写的复杂着色器
Iris + SodiumOpenGLIris 写的优化着色器
VulkanModVulkanVulkan 着色器(SPIR-V)
CanvasOpenGLCanvas 写的着色器
名词解释

SPIR-V:Vulkan 的着色器文件格式,类似 GLSL 但给 Vulkan 用)

换渲染器 = 换图形 API(可能)+ 换 GLSL(一定)。换 GLSL 是核心,因为 GLSL 决定画面长什么样。

GLSL 怎么工作?

GLSL 是 C 语言风格,写完编译成 GPU 能跑的机器码。一个简单的片段着色器例子:

#version 330 core
in vec3 color; // 从顶点着色器传来的颜色
out vec4 fragColor; // 输出的像素颜色

void main() {
fragColor = vec4(color, 1.0); // 把颜色画出来
}

这段代码告诉 GPU:每个像素的颜色就是顶点着色器传来的颜色。复杂的光影着色器会有几百行,计算光照、阴影、反射、雾效等。

手机上的渲染器

手机跑 Minecraft Java 版时,渲染器要适配手机:

  • 图形 API:OpenGL → 翻译成 OpenGL ES / Vulkan(用 GL4ES / Virgl / ANGLE)。
  • GLSL:GLSL → 翻译成 GLSL ES(移动版)或 SPIR-V(Vulkan)。

所以手机上跑光影 mod 性能比电脑差,因为多了一层翻译。但中高端手机能跑基础光影。

小结

  • 渲染器 = 把 3D 数据变成 2D 画面的程序
  • 渲染器 = 图形 API + 自定义 GLSL
    • 图形 API:和 GPU 对话的底层接口(OpenGL、Vulkan 等)。
    • GLSL:具体画图逻辑的着色器代码。
  • GLSL:OpenGL 着色语言,分顶点着色器和片段着色器。
  • Minecraft 换渲染器 = 换 GLSL(核心)+ 可能换图形 API。
  • 主流渲染器 / 优化 mod:原版、OptiFine、Iris、Sodium、VulkanMod、Canvas。
  • 手机跑 Java 版要翻译 OpenGL → OpenGL ES / Vulkan,性能不如电脑。

💡 关于 Minecraft 基岩版:需要说明的是,Minecraft 基岩版使用完全不同的 RenderDragon 渲染引擎,它原生支持 Vulkan、DirectX 12 等现代图形 API,并内置了光线追踪功能,但其光影生态与 Java 版不通用

名词解释

光线追踪:是一种超真实的画面技术,能模拟真实光线的反射、折射和阴影,让水面、玻璃、镜子看起来和真的一样