内部渲染架构
最后同步日期:2026-04-15 | Godot 官方原文 — Internal rendering architecture
内部渲染架构
渲染是游戏引擎中"最烧脑"的部分之一。当你在屏幕上看到一棵树、一束光、一片阴影时,背后是引擎的渲染系统在做大量的数学计算。Godot 4 对渲染架构做了全面重构,引入了全新的渲染方法和驱动架构。
这一章,我们来看看 Godot 的渲染系统是怎么设计的——它有哪些渲染方法可选、底层用什么图形 API、核心类如何组织、以及 2D 和 3D 各自的渲染技巧。
渲染方法
Godot 4 提供了三种渲染方法,你可以在项目设置(Project Settings → Rendering → Rendering Method)中选择:
Forward+(前向簇)
这是 Godot 4 的默认渲染方法,也是 Godot 3 的"移动"方法的全面升级版。
它的工作方式可以想象成这样:场景被划分为一个三维网格(叫做"簇"),每个簇记录了哪些光源能影响它。渲染时,每个像素只处理它所在簇中的光源,而不是场景中的所有光源。
优点:
- 支持数百个动态光源
- 每个物体只需渲染一次(不像延迟渲染那样需要多个渲染通道)
- 自然支持半透明物体
缺点:
- 复杂材质的 G-Buffer 较大,显存占用较高
- 需要较新的 GPU 支持
Mobile(移动端)
Mobile 方法使用单通道前向渲染,并采用基于分块的光照方案。它是 Godot 3 中"移动"方法的改进版本。
优点:
- 在移动设备上性能出色
- 显存占用较低
缺点:
- 支持的光源数量有限
- 某些高级效果不可用
Compatibility(兼容模式)
Compatibility 方法使用传统的前向渲染,仅支持 OpenGL 后端。它主要为 Godot 3 旧项目的平滑迁移而保留。
优点:
- 与 Godot 3 项目高度兼容
- 在非常旧的硬件上也能运行
缺点:
- 不支持 Godot 4 的新渲染特性
- 性能和画质上限最低
为什么不用延迟渲染?
你可能听说过"延迟渲染(Deferred Rendering)"——很多 AAA 游戏引擎用它。但 Godot 选择了前向渲染路线,原因如下:
| 因素 | 延迟渲染 | 前向渲染(Godot 的选择) |
|---|---|---|
| 半透明物体 | 需要额外的前向通道 | 自然支持 |
| 抗锯齿(MSAA) | 成本极高 | 低成本 |
| VR | 带宽压力大 | 友好 |
| 内存占用 | G-Buffer 占用大 | 更省显存 |
| 光源数量 | 天然支持大量光源 | Forward+ 通过簇也能支持 |
简而言之:延迟渲染在"光源多"的场景下有优势,但在现代硬件上,Forward+ 的簇方案已经能解决这个问题,同时避免了延迟渲染的各种副作用。
渲染驱动(Rendering Drivers)
渲染驱动是引擎与 GPU 之间的"翻译官"——它把引擎的绘制指令翻译成 GPU 能懂的命令。Godot 4 支持以下驱动:
| 驱动 | 状态 | 适用平台 | 备注 |
|---|---|---|---|
| Vulkan | 稳定 | Windows、Linux、Android | 主要开发平台,功能最完整 |
| Direct3D 12 | 实验性 | Windows | Godot 4.3+ 可用 |
| Metal | 实验性 | macOS、iOS | Godot 4.4+ 可用 |
| OpenGL | 兼容 | 跨平台 | 仅 Compatibility 渲染方法使用 |
RenderingDevice 抽象层
在 Vulkan、Direct3D 12 和 Metal 之上,Godot 提供了一个统一的抽象层——RenderingDevice。它屏蔽了不同图形 API 之间的差异,让引擎的大部分渲染代码只需要写一遍。
提示
如果你要编写自定义着色器,在 Forward+ 和 Mobile 方法下需要使用 Vulkan 风格的 GLSL(通过 RenderingDevice),而在 Compatibility 方法下则使用传统的 OpenGL GLSL。
核心渲染类架构
Godot 的渲染系统由多个核心类协同工作:
- RenderingServer:所有渲染操作的入口。场景中的节点(如 MeshInstance3D、DirectionalLight3D)通过它向底层发送渲染指令。
- RendererSceneRender:负责场景的绘制流程,包括剔除、排序、设置光照等。
- RendererRD:封装了 RenderingDevice,管理纹理、缓冲区、帧缓冲和着色器等底层资源。
核心着色器
Godot 的内置着色器使用 GLSL 编写,在引擎编译时嵌入二进制文件中。这意味着它们不是运行时加载的外部文件,而是直接编译进了引擎本体。
注意
由于着色器在编译时嵌入,如果你想修改内置着色器,需要重新编译引擎。
着色器的组织方式:
- 场景着色器:处理 3D 场景中的物体渲染(空间、光照、阴影、雾等)
- 2D 着色器:处理 2D 场景中的 CanvasItem 渲染
- 后处理着色器:处理屏幕空间效果(泛光、色调映射、SSAO 等)
- 特效着色器:粒子系统、天空、体积雾等特效
2D 渲染与 3D 渲染的分离
Godot 将 2D 和 3D 渲染完全分离开来,它们有不同的工作流程和色彩空间:
| 维度 | 2D 渲染 | 3D 渲染 |
|---|---|---|
| 色彩空间 | sRGB(低动态范围) | 线性 HDR(高动态范围) |
| 典型用途 | UI、精灵、2D 游戏 | 3D 场景、光照、后处理 |
| 目标受众 | 2D 游戏开发者 | 3D 游戏开发者 |
这种分离意味着:2D 内容直接在 sRGB 色彩空间中渲染,不需要复杂的色调映射;而 3D 内容在线性空间中渲染,最后再转换到显示器的色彩空间。
2D 渲染技术
批处理(Batching)
2D 渲染器会自动将使用相同材质的多个绘制请求合并为一次 GPU 调用(Draw Call),这叫做"批处理"。
打个比方:如果你有 100 个使用同一张图片的精灵,引擎不会发出 100 次绘制命令,而是把它们"打包"成一次命令发给 GPU。这大大减少了 CPU 和 GPU 之间的通信开销。
多重采样抗锯齿(MSAA)
2D 渲染支持 MSAA,可以通过项目设置中的 Rendering → Quality → 2D → MSAA 来启用。MSAA 通过对像素边缘多次采样来消除锯齿,让画面更加平滑。
有符号距离场(SDF)
Godot 支持使用 SDF(Signed Distance Field)来渲染文字和字体轮廓。SDF 的好处是:无论你怎么缩放文字,边缘始终是平滑的——非常适合不同分辨率的屏幕。
3D 渲染技术
3D 渲染的技术栈非常丰富,以下是各核心技术的概要。
批处理与实例化(Batching & Instancing)
和 2D 类似,3D 渲染器也会合并绘制请求。当场景中有大量相同几何体的实例时(比如一片森林),引擎会使用 GPU 实例化(Instancing)来高效渲染它们——只需一次 Draw Call 就能画出所有实例。
簇光照(Clustered Lighting)
这是 Forward+ 的核心特性。三维空间被划分为许多小立方体(簇),每个簇记录了能影响它的光源列表。渲染时,片段着色器只遍历所在簇的光源,大大减少了计算量。
阴影映射(Shadow Mapping)
Godot 使用阴影映射来生成阴影。每个光源都会从自己的视角渲染一张"深度图",然后在最终渲染时用这张图来判断哪些区域被遮挡。
Godot 支持两种阴影过滤技术:
| 技术 | 说明 | 效果 |
|---|---|---|
| PCF(Percentage-Closer Filtering) | 对阴影边缘多次采样并取平均值 | 较柔和,性能开销小 |
| PCSS(Percentage-Closer Soft Shadows) | 根据遮挡物距离动态调整半影大小 | 接近物理真实的软阴影,开销较大 |
时序抗锯齿(TAA)与 FSR 2.2
Godot 4 引入了 TAA(Temporal Anti-Aliasing),通过混合多帧的渲染结果来消除锯齿和闪烁。TAA 还可以配合 AMD FSR 2.2(FidelityFX Super Resolution)使用,在低分辨率渲染后智能放大到目标分辨率,在保持画质的同时大幅提升性能。
全局光照(Global Illumination, GI)
全局光照是让光线"弹来弹去"的技术——它模拟了光线在物体表面之间的反射,让场景看起来更加真实。Godot 支持三种 GI 方案:
| 方案 | 类型 | 适用场景 |
|---|---|---|
| VoxelGI | 实时(体素) | 动态场景,中等大小的室内/室外 |
| SDFGI | 实时(有符号距离场) | 大型动态场景,尤其是室外 |
| LightmapGI | 预烘焙(光照贴图) | 静态场景,画质最高,运行时零开销 |
景深(Depth of Field)
模拟真实相机的对焦效果——离焦点越远的物体越模糊。适合用于电影级画面和摄影风格的渲染。
环境光遮蔽与屏幕空间效果
Godot 提供了一系列"屏幕空间"的视觉效果:
| 效果 | 缩写 | 作用 |
|---|---|---|
| 屏幕空间环境光遮蔽 | SSAO | 让物体角落和缝隙处变暗,增加立体感 |
| 屏幕空间间接光照 | SSIL | 模拟光线在表面的反射,增强 GI 效果 |
| 屏幕空间反射 | SSR | 在光滑表面上渲染反射效果 |
| 次表面散射 | SSS | 模拟光线穿透半透明材质(如皮肤、蜡烛)的效果 |
提示
这些效果都是基于屏幕空间的,意味着它们只对"屏幕上能看到的东西"起作用。如果反射的目标不在屏幕内,SSR 就无法工作——这时候需要用环境贴图(ReflectionProbe)来补充。
天空渲染
Godot 支持多种天空渲染方式:
- 程序化天空:使用 PanoramaSky 节点配合 HDRI 贴图
- 物理天空:使用 ProceduralSky 节点模拟大气散射
- 自定义着色器天空:通过 SkyShaderMaterial 编写自定义天空效果
体积雾(Volumetric Fog)
体积雾让光在空气中散射,产生"光柱"和"雾气弥漫"的效果。它基于 3D 体素化计算,可以与方向光、点光源和聚光灯交互。
遮挡剔除(Occlusion Culling)
遮挡剔除会自动隐藏被其他物体完全挡住的物体,避免 GPU 做无用功。Godot 使用 Embree 库(Intel 的光线追踪内核)来进行高效的遮挡查询。
可见距离与 LOD
Godot 提供了两种简化远处物体的方式:
- 可见距离(Visibility Range):超过设定距离的物体直接不渲染
- 自动网格 LOD(Automatic Mesh LOD):根据距离自动切换到更低面数的网格版本,Godot 可以在导入时自动生成这些简化网格
注意
遮挡剔除和自动 LOD 都是 Godot 4 的新功能,仅在 Forward+ 和 Mobile 渲染方法下可用。
渲染管线总览
把以上所有技术串联起来,一帧 3D 画面的渲染流程大致如下:
