菜单

渲染系统

相关源文件

Godot 引擎的渲染系统负责将图形绘制到屏幕上、管理材质和着色器,以及提供将 3D 和 2D 场景转换为渲染输出的管线。本文档描述了 Godot 渲染系统的架构、组件和流程。有关 3D 渲染或着色器语言等特定渲染功能的信息,请参阅 3D 渲染着色器系统

架构概述

Godot 的渲染系统遵循多层架构,高层 API 与底层渲染后端之间有清晰的分离。

渲染系统包含以下主要组件:

  1. RenderingServer:提供给引擎的高层 API。
  2. Renderers:不同渲染方法/平台的实现。
    • Forward Clustered:具有高级功能的现代桌面渲染器。
    • Forward Mobile:针对移动平台进行了优化。
    • GLES3:经典的 OpenGL ES 3.0 实现。
  3. Storage Systems:管理材质、纹理和网格。
  4. RenderingDevice:现代图形 API 之上的硬件抽象层。

来源:drivers/gles3/rasterizer_scene_gles3.h149-152 drivers/gles3/rasterizer_canvas_gles3.h147-150 servers/rendering/renderer_rd/forward_clustered/scene_shader_forward_clustered.h1-6 servers/rendering/renderer_rd/forward_mobile/scene_shader_forward_mobile.h1-6

渲染管道

渲染管线将场景数据转换为屏幕上显示的帧。

渲染管线涉及以下关键步骤:

  1. 场景处理:遍历场景树以收集所有可见的几何体。
  2. 几何体准备:对几何体进行排序、剔除和批处理,以实现高效渲染。
  3. 光照设置:处理并将光照数据上传到 GPU。
  4. 阴影渲染:为所有投射阴影的光照生成阴影贴图。
  5. 主渲染通道:使用正确的材质和着色器渲染场景。
  6. 后期处理:应用色调映射、泛光和抗锯齿等效果。

来源:drivers/gles3/rasterizer_scene_gles3.cpp107-171 servers/rendering/renderer_rd/forward_clustered/scene_shader_forward_clustered.cpp31-40

材质系统

材质定义了物体渲染时的外观。Godot 拥有多种材质类型,并有清晰的继承层次结构。

材质系统负责以下职责:

  1. 着色器分配:材质可以拥有自定义着色器或使用内置预设。
  2. 参数管理:存储和更新着色器参数。
  3. 纹理分配:管理不同材质属性的纹理。
  4. 渲染状态:控制混合模式、深度测试等。
  5. 材质实例:高效地在实例之间共享材质数据。

来源:scene/resources/material.h39-65 scene/resources/material.cpp39-187 scene/resources/material.cpp582-643 doc/classes/BaseMaterial3D.xml1-12

着色器系统

着色器定义了每个像素如何渲染。Godot 提供了一个完整的着色器管线。

着色器系统的关键组件包括:

  1. ShaderLanguage:Godot 着色器语言的解析器。
  2. ShaderCompiler:将 Godot 着色器代码转换为 GLSL/SPIR-V。
  3. Shader Variants:用于创建专用着色器版本的系统。
  4. Shader Uniforms:用于将数据绑定到着色器的参数系统。
  5. Built-in Shaders:用于常见渲染需求的标准着色器。

来源:servers/rendering/shader_language.h47-80 servers/rendering/shader_language.cpp42-248 servers/rendering/shader_compiler.cpp1-10 servers/rendering/shader_compiler.h1-10

渲染后端

Godot 支持多种渲染后端,以适应不同的平台和需求。

GLES3 后端

GLES3 后端使用 OpenGL ES 3.0,适用于广泛的设备。

  1. RasterizerGLES3:GLES3 后端的主要光栅化器。
  2. RasterizerSceneGLES3:处理 3D 场景渲染。
  3. RasterizerCanvasGLES3:处理 2D Canvas 渲染。
  4. GLES3 存储类:处理纹理、材质和网格。

主要功能包括

  • 标准光照模型。
  • PBR 材质。
  • 屏幕空间特效。
  • 2D 批处理和原始渲染。

来源:drivers/gles3/rasterizer_scene_gles3.cpp31-33 drivers/gles3/rasterizer_canvas_gles3.cpp31-47 drivers/gles3/storage/material_storage.cpp31-45

Rendering Device (RD) 后端

RD 后端是一个更现代、更高效的渲染器。

  1. RenderingDeviceDriver:硬件抽象层。
  2. Forward Clustered Renderer:高级桌面渲染器。
  3. Forward Mobile Renderer:优化的移动渲染器。
  4. RD Storage Classes:高效的资源管理。

主要功能包括

  • 簇状前向渲染。
  • 更高级的着色器特性。
  • 更好的批处理和 GPU 资源管理。
  • 跨平台抽象,支持现代图形 API。

来源:servers/rendering/renderer_rd/forward_clustered/scene_shader_forward_clustered.cpp31-38 servers/rendering/renderer_rd/forward_mobile/scene_shader_forward_mobile.cpp31-38 servers/rendering/renderer_rd/renderer_canvas_render_rd.cpp31-43

着色器类型和管线

Godot 支持多种着色器类型,每种都有特定的用途。

着色器类型目的特性流水线阶段
Spatial (空间)3D 渲染。PBR、光照、阴影。顶点、片段。
Canvas Item (画布项)2D 渲染。精灵、UI、特效。顶点、片段。
Particles (粒子)粒子特效。基于 GPU 的粒子。顶点、片段。
Sky (天空)天空渲染。环境、程序化天空。顶点、片段。
Fog (雾)体积雾。大气效果。顶点、片段。

着色器管线具有特定的处理步骤:

  1. 解析:将着色器代码转换为标记和 AST(抽象语法树)。
  2. 分析:验证着色器代码并检测使用的特性。
  3. 编译:生成 GPU 可兼容的代码(GLSL/SPIR-V)。
  4. 链接:为 GPU 执行创建着色器程序。
  5. 特化:为特定的渲染用例创建优化的变体。

来源: servers/rendering/shader_types.cpp1-10 servers/rendering/shader_language.cpp30-165 drivers/gles3/shaders/scene.glsl1-20 drivers/gles3/shaders/canvas.glsl1-20

材质处理

材质经过几个阶段才能为渲染做好准备

材质处理管线包括

  1. 参数设置:设置材质属性
  2. 着色器分配:将材质与着色器连接
  3. 资源绑定:准备纹理和统一缓冲区
  4. 状态设置:配置渲染状态(混合模式等)
  5. GPU上传:将材质数据传输到GPU

来源: drivers/gles3/storage/material_storage.cpp44-173 servers/rendering/renderer_rd/storage_rd/material_storage.cpp1-20 scene/resources/material.cpp39-64 scene/resources/material.cpp189-325

与场景树的集成

渲染系统通过数据流过程与场景树集成

集成涉及以下关键步骤

  1. 节点更新:节点在需要绘制时通知场景树
  2. 视口处理:视口收集可见对象
  3. 渲染服务器:管理渲染资源和命令
  4. 渲染实现:执行实际渲染操作
  5. 合成:组合 2D 和 3D 元素以输出最终结果

来源: drivers/gles3/rasterizer_scene_gles3.cpp107-110 drivers/gles3/rasterizer_canvas_gles3.cpp107-116 servers/rendering/renderer_rd/renderer_canvas_render_rd.cpp103-122

性能考量

渲染系统包含多项优化

  1. 批处理:将相似的绘制调用分组以减少 API 开销
  2. 实例化:高效地渲染同一网格的多个副本
  3. 遮挡剔除:避免渲染隐藏的对象
  4. 细节层次(LOD):对远处对象使用简化的模型
  5. 着色器变体:针对特定渲染场景的专用着色器
  6. 纹理压缩:减少纹理的内存使用

来源: drivers/gles3/rasterizer_scene_gles3.cpp361-438 servers/rendering/renderer_rd/forward_clustered/scene_shader_forward_clustered.cpp40-100

结论

Godot 的渲染系统提供了一种灵活、模块化的图形渲染方法。它支持针对不同平台和用例的多种后端,拥有一个清晰的 API,将高级场景管理与底层渲染实现分离。该系统设计得易于扩展,并支持 2D 和 3D 渲染,采用统一的架构。