着色器包是着色器(shader)资源的集合,通常打包为一个文件或目录,供图形程序、游戏引擎或游戏统一加载和切换。它不同于单个着色器程序,强调的是成组组织的可复用资源。游戏中最广为人知的形态是《我的世界》光影包,即一个内含多个着色器程序的 zip 压缩包,把原本简单直接的光照与水面表现替换为实时阴影、体积雾、反射和屏幕空间光线追踪等效果。着色器包也是引擎预编译与缓存着色器、减少运行时卡顿的重要载体。
定义
着色器包是着色器程序的集合。以《我的世界》所采用的 OptiFine 格式为例,它被定义为一个 zip 文件,其中包含许多具备固定命名的着色器程序,这些名字说明了每段程序在什么时机被调用[1]。这与单个着色器程序不同:单个着色器程序是运行在 GPU 上的一段代码,负责把世界坐标换算成屏幕位置,或逐像素决定颜色[1]。
着色器本身是执行图形计算的计算机程序,例如顶点变换或像素着色,一般运行在 GPU 而非 CPU 上。常见类型包括按顶点计算的顶点着色器,以及决定像素颜色的像素着色器,后者也称片元着色器;现代硬件还支持船体着色器、域着色器、几何着色器和用于非图形计算的计算着色器[2]。着色器最初使用类汇编语言编写,如今多以 HLSL 这类类 C 的高级语言编写[2]。
在引擎语境中,类似的集合概念有不同的名字和用途。游戏《骑马与砍杀 2:领主》的引擎自带一份着色器缓存,存放基础游戏中所有唯一的着色器与材质标志组合;模组若引入大量新组合,应在发布模块时勾选编译着色器,以免运行时编译打断游戏流程[3]。Unity 则提供着色器变体集合,用于预加载着色器变体,并防止运行时需要但场景中未被引用的变体在构建时被剔除[4]。
原理
着色器包本身不新增渲染能力,它通过替换和插入渲染管线中的可编程阶段来改变画面。图形管线是把手头模型的顶点与纹理一路处理到渲染目标像素的过程,其中顶点着色器对每个顶点执行,把顶点位置从模型空间变换到屏幕空间,并向下传递逐顶点数据[5]。光栅化阶段把图元拆分为片元,片元着色器对每个存活的片元执行,借助插值后的纹理坐标、法线等数据决定写入颜色与深度[5]。
在《我的世界》光影包的实现里,包内的文件按用途命名,例如主合成、水体缓冲区、阴影生成等,各自告诉显卡该按什么算法计算亮度、采样哪张贴图、叠加几层模糊[6]。顶点着色器负责坐标变换、逐顶点光照并输出后续阶段所需数据,片元着色器则进行纹理采样和逐像素计算[7]。
$颜色 = f(顶点位置, 法线, 纹理坐标, 光照参数)$,其中 f 由着色器包中各组程序共同实现。
使用这类资源还有工程上的收益。Unity 可以要求图形驱动在着色器变体首次被需要之前就创建它们的 GPU 表示形式,这一过程称为预热,用于避免在高负载时出现明显停顿[4]。引擎在运行时若从缓存中找不到某个着色器,就必须在本地重新编译,或借助远程着色器编译器完成[8]。
发展历程
早期图形管线的多数阶段由固定功能电路完成,顶点变换、光照与颜色混合都有既定硬件实现[2]。随着传统固定功能管线的阶段改由着色器程序承担,开发者得以构建贴合自身应用需求的管线,着色器集合式的分发方式也随之出现[2]。
在《我的世界》生态中,OptiFine 长期是加载光影包的主要组件,它开放了着色器包加载入口等底层能力,多数光影包依赖它才能运行[6]。2021 年首次发布的 Iris 是建立在 Sodium 渲染引擎之上的开源着色器加载器,按 OptiFine 的着色器包格式读取同一批压缩包,兼容 Fabric、NeoForge 与 Quilt,采用 LGPL-3.0 许可证[9]。
着色器包的作者群体推动了内容积累。据一份收录 31 个光影包的对比清单统计,其中 20 个包可在 Iris 或 OptiFine 下加载,6 个仅支持 Iris,5 个仅支持 OptiFine;该清单显示 SEUS PTGI HRR 与 Continuum Shaders 均止步于《我的世界》1.20.4[10]。
应用
游戏渲染是最主要的应用场景。以《我的世界》为例,着色器包用于实现动态柔和阴影、屏幕空间路径追踪、时间抗锯齿与上采样、多层云的程序化天空盒、屏幕空间反射、体积雾,以及与一天中时间绑定的随机天气[11]。部分包还提供基于体素的全局光照,对场景做体素化后追踪光线的弹射,从而得到带颜色的间接照明[12]。
在引擎与工具链中,同类集合被用于资源分发与性能控制。Unity 资源商店上的着色器资源包按渲染管线区分兼容性,例如某些包仅兼容高清渲染管线,另一些仅兼容通用渲染管线。也有以仓库形式组织的着色器合集,按特效、后处理、几何与界面等用途分类,并通过包管理器导入项目[13]。
移动端和低配设备是另一个方向。Unity 中国资源商店中的冰雪世界等资源以纹理与着色器变体库的形式提供,所有着色器和材质都兼容移动设备[14];而在《我的世界》中,轻量光影包被作为集成显卡用户的替代选择[10]。
局限
着色器包对硬件的依赖较强。以《我的世界》的高端光影包为例,其对比清单给出的显存要求从 3 GB 到 8 GB 不等,其中 SEUS Renewed 需 3 GB,SEUS PTGI HRR、Photon、Rethinking Voxels 需 6 GB,Continuum Shaders 与 Hysteria Shaders 需 8 GB,六款高负载包都要求 6 GB 系统内存[12]。一份部署指南则建议轻量包至少 2 GB 显存,SEUS PTGI 或 Bliss 这类路径追踪包在 1080p 下需 8 GB 以上显存[15]。
兼容性是另一项限制。着色器包与加载器、游戏版本相互绑定:Iris 的版本同时对应特定的 Sodium 版本和《我的世界》版本[15];而 IRIS 与 OptiFine 会修补同一条渲染管线,二者不应同时安装[15]。此外,部分较早的包面向旧版 OptiFine 编写,在 Iris 下无法加载[15],Iris 也不支持 1.20 以后的旧版 Forge 加载器[9]。
版本停滞会使资源包失去可用性。多个知名包的最高支持版本停留在较早的游戏版本,若玩家的世界已升级到更新版本,即便显卡性能充足也无法使用这些包[12]。引擎侧同样存在限制:着色器缓存的组合是针对特定游戏版本预先编译的,游戏着色器在版本更新中发生变化时,旧缓存文件会失效而不再被使用[3]。
加载与编译过程本身也可能造成问题。着色器包首次启用时通常需要等待编译完成,画面才会以新效果呈现[15]。引擎在着色器变体首次被用到时才创建 GPU 表示形式,若缺少预热,在性能开销大的时刻会出现可见停顿[4]。
参见
参考资料
- Getting Started with Shaders [引用日期2026-10-14]
- working-with-shaders [引用日期2026-10-14]
- Shaders [引用日期2026-10-14]
- 团结引擎 [引用日期2026-10-14]
- Introduction [引用日期2026-10-14]
- Minecraft光影原理与OptiFine安装全解析 [引用日期2026-10-14]
- [转载]Unity用户手册-Shader [引用日期2026-10-14]
- CRYENGINE | Documentation [引用日期2026-10-14]
- Iris Shaders 26.2 - 26.1.2 | Latest Downloads [引用日期2026-10-14]
- All Minecraft Shaders - Shader Pack List | Astroworld [引用日期2026-10-14]
- Kappa Minecraft Shaders [引用日期2026-10-14]
- Best High-End Minecraft Shaders 2025 | Astroworld [引用日期2026-10-14]
- github.com 上的网页 [引用日期2026-10-14]
- 冰雪世界 (Ice World) | VFX 着色器 | Unity 中国资源商店 [引用日期2026-10-14]
- how-to-install-minecraft-shaders [引用日期2026-10-14]