Godot 的着色器系统是一个用于创建、编译和执行着色器的框架,它控制着引擎中内容的渲染方式。它包括着色语言解析器、编译管线以及一个基于节点的视觉着色器编辑器,使开发者能够通过代码和可视化编程实现自定义渲染效果。
有关高级渲染系统的信息,请参阅渲染系统。
Godot 的着色器系统由几个关键组件组成,它们协同工作来处理和执行着色器代码
来源
ShaderLanguage 类作为 Godot 的着色语言 (类似 GLSL) 的解析器和词法分析器。它将着色器源代码处理成一个结构化格式,然后供着色器编译器使用。
着色语言解析器处理:
来源
ShaderLanguage 类为解析和处理着色器代码定义了一套全面的标记类型和数据类型。
| 类别 | 示例 |
|---|---|
| 基本类型 | void、bool、int、uint、float |
| 向量类型 | vec2、vec3、vec4、ivec2、ivec3、ivec4、uvec2、uvec3、uvec4、bvec2、bvec3、bvec4 |
| 矩阵类型 | mat2、mat3、mat4 |
| 采样器类型 | sampler2D、sampler3D、samplerCube、sampler2DArray |
| 运算符 | +, -, *, /, =, ==, !=, <, >, &&, ` |
| 流量控制 | if、else、for、while、do、switch、case、break、continue、return、discard |
| 限定符 | uniform、varying、in、out、inout、const |
来源
Visual Shader 系统提供了一个基于节点的接口,用于创建着色器,而无需直接编写代码。它的设计目标是使着色器创建更容易,同时仍然允许实现复杂的着色器效果。
来源
Visual Shader Editor 提供了一个图形化的节点界面,让用户通过该界面创建和编辑视觉着色器。它提供了一个画布用于连接节点和编辑属性。
来源
视觉着色器节点根据其功能分为不同类型
| 类别 | 描述 | 示例 |
|---|---|---|
| 输入 | 着色器的源值 | 位置、UV、颜色、纹理 |
| 输出 | 最终着色器输出 | 顶点、片段、光照 |
| 常量 | 固定值 | 浮点数、整数、向量、颜色 |
| 运算符 | 数学运算 | 加法、乘法、除法、混合 |
| 函数 | 实用函数 | 菲涅尔、法线贴图、钳位 |
| 变换 | 变换操作 | 矩阵乘法、向量变换 |
| 纹理 | 纹理操作 | 纹理采样、纹理参数 |
| 变量 | 用户定义变量 | 变量、Uniforms |
| 自定义 | 用户定义节点 | 自定义代码、自定义函数 |
来源
编译视觉着色器时,它会将节点图转换为可以由着色器编译器处理的着色器代码
代码生成过程
generate_code() 方法以获取其 GLSL 表示来源
ShaderCompiler 类接收处理后的着色器代码,并将其编译成可以由 GPU 执行的特定于平台的着色器程序。
着色器编译的关键步骤包括:
来源
材质通过将编译后的着色器应用于几何体,将着色器系统连接到渲染器。它们负责管理着色器参数和纹理绑定。
材质接口允许:
来源
着色器系统与 2D (canvas) 和 3D (scene) 渲染系统集成,以提供可自定义的材质效果。
在 Canvas (2D) 渲染系统中
在 Scene (3D) 渲染系统中
来源
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 在着色器中应用了几项性能优化
这些优化有助于在各种硬件能力下保持良好的性能。
来源
可视化着色器编辑器提供了一个基于节点的界面,用于创建和编辑可视化着色器
该编辑器通过以下方式增强了着色器创建工作流程:
来源
VisualShaderNodeCustom 类允许开发者为可视化着色器编辑器创建自己的自定义着色器节点
可以通过以下方式创建自定义节点:
来源
Godot 的着色器系统提供了一种灵活而强大的方式来创建自定义渲染效果。它既提供了文本着色器语言以供直接编码,也提供了基于节点的视觉系统以供更便捷地创建着色器。该系统与 Godot 的渲染管线集成,为 2D 和 3D 内容提供可自定义的材质,并支持各种渲染技术和视觉效果。
精心设计的着色器语言、高效的编译以及直观的可视化编辑器相结合,使得具有不同技术专长水平的用户都可以轻松进行着色器编程,同时仍然能够获得创建高级图形效果所需的强大功能。