菜单

着色器系统

相关源文件

Godot 的着色器系统是一个用于创建、编译和执行着色器的框架,它控制着引擎中内容的渲染方式。它包括着色语言解析器、编译管线以及一个基于节点的视觉着色器编辑器,使开发者能够通过代码和可视化编程实现自定义渲染效果。

有关高级渲染系统的信息,请参阅渲染系统

概述

Godot 的着色器系统由几个关键组件组成,它们协同工作来处理和执行着色器代码

来源

着色语言解析器

ShaderLanguage 类作为 Godot 的着色语言 (类似 GLSL) 的解析器和词法分析器。它将着色器源代码处理成一个结构化格式,然后供着色器编译器使用。

着色语言解析器处理:

  1. 词法分析 - 将着色器代码分解为诸如标识符、关键字和运算符之类的标记
  2. 解析 - 从标记构建抽象语法树 (AST)
  3. 类型检查 - 验证操作是否在兼容的类型上执行
  4. 语义验证 - 确保着色器遵循语言规则

来源

标记类型和数据类型

ShaderLanguage 类为解析和处理着色器代码定义了一套全面的标记类型和数据类型。

类别示例
基本类型voidboolintuintfloat
向量类型vec2vec3vec4ivec2ivec3ivec4uvec2uvec3uvec4bvec2bvec3bvec4
矩阵类型mat2mat3mat4
采样器类型sampler2Dsampler3DsamplerCubesampler2DArray
运算符+, -, *, /, =, ==, !=, <, >, &&, `
流量控制ifelseforwhiledoswitchcasebreakcontinuereturndiscard
限定符uniformvaryinginoutinoutconst

来源

视觉着色器系统

Visual Shader 系统提供了一个基于节点的接口,用于创建着色器,而无需直接编写代码。它的设计目标是使着色器创建更容易,同时仍然允许实现复杂的着色器效果。

类层次结构

来源

视觉着色器编辑器

Visual Shader Editor 提供了一个图形化的节点界面,让用户通过该界面创建和编辑视觉着色器。它提供了一个画布用于连接节点和编辑属性。

来源

节点类型

视觉着色器节点根据其功能分为不同类型

类别描述示例
输入着色器的源值位置、UV、颜色、纹理
输出最终着色器输出顶点、片段、光照
常量固定值浮点数、整数、向量、颜色
运算符数学运算加法、乘法、除法、混合
函数实用函数菲涅尔、法线贴图、钳位
变换变换操作矩阵乘法、向量变换
纹理纹理操作纹理采样、纹理参数
变量用户定义变量变量、Uniforms
自定义用户定义节点自定义代码、自定义函数

来源

视觉到代码的转换

编译视觉着色器时,它会将节点图转换为可以由着色器编译器处理的着色器代码

代码生成过程

  1. 按依赖顺序遍历节点图
  2. 调用每个节点的 generate_code() 方法以获取其 GLSL 表示
  3. 解析节点之间的连接,将输出映射到输入
  4. 组装完整的着色器程序,包含正确的变量声明和赋值
  5. 将生成的代码传递给着色器编译器

来源

着色器编译

ShaderCompiler 类接收处理后的着色器代码,并将其编译成可以由 GPU 执行的特定于平台的着色器程序。

着色器编译的关键步骤包括:

  1. 预处理 - 处理 include、define 和条件编译
  2. 解析 - 将着色器代码转换为抽象语法树
  3. 特定后端处理 - 为目标渲染 API (OpenGL, Vulkan 等) 调整着色器
  4. 优化 - 提高着色器性能
  5. 代码生成 - 为 GPU 生成最终的着色器代码

来源

材质集成

材质通过将编译后的着色器应用于几何体,将着色器系统连接到渲染器。它们负责管理着色器参数和纹理绑定。

材质接口允许:

  1. 设置着色器参数 (uniforms)
  2. 绑定纹理和其他资源
  3. 配置渲染状态属性
  4. 启用/禁用着色器功能

来源

渲染集成

着色器系统与 2D (canvas) 和 3D (scene) 渲染系统集成,以提供可自定义的材质效果。

在 Canvas (2D) 渲染系统中

  • 着色器可以修改精灵、UI 元素和其他 2D 对象
  • 为常见的 2D 操作提供了特殊的优化

在 Scene (3D) 渲染系统中

  • 着色器定义 3D 模型的材质属性
  • 不同类型的着色器处理各种渲染阶段 (顶点、片段、光照)
  • PBR 材质等高级功能通过着色器实现

来源

着色器类型

Godot 着色器根据其在渲染管线中的用途进行分类

着色器类型描述用例
空间用于 3D 渲染模型、环境、空间效果
画布项用于 2D 渲染精灵、UI 元素、2D 效果
粒子用于粒子系统粒子行为和渲染
Sky (天空)用于天空渲染天空盒、大气
Fog (雾)用于体积雾大气效果

每种着色器类型都有特定的入口点和可用的内置变量,以适应其用途。

来源

内置着色器函数和变量

Godot 的着色器语言为常见的操作提供了多种内置函数和变量

类别示例
数学sin, cos, tan, pow, exp, log, sqrt
几何length, distance, normalize, reflect, dot, cross
纹理texture, textureLod, textureProj
导数dFdx, dFdy, fwidth
内置变量VERTEX, NORMAL, UV, COLOR, SCREEN_TEXTURE

这些函数和变量为创建复杂的着色器效果提供了基础,无需从头开始实现所有内容。

来源

性能考量

Godot 在着色器中应用了几项性能优化

  1. 着色器缓存 - 编译后的着色器会缓存起来,避免重复编译
  2. 统一缓冲区对象 (UBO) - 用于有效地将数据传递给着色器
  3. 特化常量 - 允许创建优化的着色器变体
  4. 着色器变体 - 不同功能集的着色器不同版本
  5. 条件编译 - 移除未使用的代码路径

这些优化有助于在各种硬件能力下保持良好的性能。

来源

可视化着色器编辑器界面

可视化着色器编辑器提供了一个基于节点的界面,用于创建和编辑可视化着色器

该编辑器通过以下方式增强了着色器创建工作流程:

  1. 提供节点连接和数据流的视觉反馈
  2. 提供着色器效果的实时预览
  3. 支持轻松访问节点属性和参数
  4. 支持通过拖放创建着色器图

来源

自定义着色器节点

VisualShaderNodeCustom 类允许开发者为可视化着色器编辑器创建自己的自定义着色器节点

可以通过以下方式创建自定义节点:

  1. 继承 VisualShaderNodeCustom 类
  2. 实现虚拟方法来定义节点行为
  3. 提供将插入着色器中的自定义 GLSL 代码
  4. 定义输入和输出端口,用于与其他节点进行连接

来源

总结

Godot 的着色器系统提供了一种灵活而强大的方式来创建自定义渲染效果。它既提供了文本着色器语言以供直接编码,也提供了基于节点的视觉系统以供更便捷地创建着色器。该系统与 Godot 的渲染管线集成,为 2D 和 3D 内容提供可自定义的材质,并支持各种渲染技术和视觉效果。

精心设计的着色器语言、高效的编译以及直观的可视化编辑器相结合,使得具有不同技术专长水平的用户都可以轻松进行着色器编程,同时仍然能够获得创建高级图形效果所需的强大功能。