简介: https://docs.godotengine.org/en/stable/tutorials/shaders/introduction_to_shaders.html 语法: Shading language


着色器是一种在图形处理单元 (GPU) 上运行的特殊程序。它们最初用于着色 3D 场景,但现在功能更加丰富。您可以使用它们来控制引擎在屏幕上绘制几何体和像素的方式,从而实现各种效果。

Godot 提供了一种基于流行的 OpenGL 着色语言 (GLSL) 并经过简化的着色语言。该引擎会为您处理一些底层初始化工作,让您更轻松地编写复杂的着色器。

入口函数(处理器函数)

在 Godot 中,着色器由称为“处理器函数”的主要函数组成。处理器函数是着色器进入程序的入口。共有七种不同的处理器函数。

  1. vertex() 函数遍历网格中的所有顶点,并设置它们的位置以及其他一些顶点变量。用于 canvas_item 着色器 和 空间着色器
  2. fragment() 函数针对网格覆盖的每个像素运行。它使用函数输出的值 vertex(),并在顶点之间进行插值。用于 canvas_item 着色器 和 空间着色器
  3. light() 函数针对每个像素和每个光源运行。它从 fragment() 函数本身及其之前的运行中获取变量。用于 canvas_item 着色器 和 空间着色器
  4. start() 函数在粒子系统中的每个粒子首次生成时运行一次。用于 粒子着色器
  5. process() 函数针对粒子系统中的每个粒子,每帧运行一次。用于 粒子着色器
  6. sky() 当辐射立方体贴图需要更新时,该函数会针对辐射立方体贴图中的每个像素运行,并且会针对当前屏幕上的每个像素运行。用于 天空着色器
  7. fog() 函数针对体积雾锥素缓冲区中与 雾体积 (FogVolume) 相交的每个锥素运行。由 雾着色器 使用。

顶点处理器

The vertex() processing function is called once for every vertex in spatial and canvas_item shaders.

你的世界中的几何体上,每一个顶点都有位置、颜色等属性。该函数会修改这些值,并将其传入片段函数。你也可以借助 varying 向片段着色器传递额外的数据。

默认情况下,Godot 会为你对顶点信息进行变换,这是将几何体投影到屏幕上所必须的。你可以使用渲染模式来自行变换数据;示例见 Spatial 着色器文档

片段处理器

fragment() 处理函数的作用是设置每一个像素的 Godot 材质参数。这里的代码会在绘制的对象或图元的每一个可见像素上执行。只能在 spatialcanvas_itemsky 着色器中使用。

片段函数的标准用途是设置用于计算光照的材质属性。例如,你可以为 ROUGHNESSRIMTRNASMISSION 等设置值,告诉光照函数光照应该如何处理对应的片段。这样就可以控制复杂的着色管线,而不必让用户编写过多的代码。如果你不需要这一内置功能,那么你可以忽略它,自行编写光照处理函数,Godot 会将其优化掉。例如,如果你没有向 RIM 写入任何值,那么 Godot 就不会计算边缘光照。编译时,Godot 会检查是否使用了 RIM;如果没有,那么它就会把对应的代码删除。因此,你就不会在没有使用的效果上浪费算力。

光照处理器

light() 处理器也会在每一个像素上运行,并且同时还会在每一个影响该对象的灯光上运行。如果没有灯光影响该对象则不会运行。它会被用于 fragment() 处理器,一般会在 fragment() 函数中进行材质属性设置时执行。

light() 处理器在 2D 和 3D 中的工作方式不同;每种工作方式的详细描述请参阅它们对应的文档 CanvasItem 着色器 and Spatial 着色器

着色器类型

shader_type 在 Godot Shader 语言中用于指定着色器的类型。常见枚举如下:

  • spatial:用于 3D 物体的表面着色器(空间着色器)。
  • canvas_item:用于 2D 物体的着色器(画布项着色器)。
  • particle:用于粒子系统的着色器(粒子着色器)。
  • sky:用于天空盒或环境的着色器(天空着色器)。
  • fog:用于雾效的着色器(雾着色器)。

每种类型决定了着色器的用途和可用的内置变量。

渲染模式

着色器具有可选的渲染模式,您可以在着色器类型之后的第二行指定,如下所示:

shader_type spatial;
render_mode unshaded, cull_disabled;

渲染模式会修改 Godot 应用着色器的方式。例如,unshaded 模式会让引擎跳过内置的光线处理器函数。

每种着色器类型都有不同的渲染模式。每种着色器类型的完整渲染模式列表请参阅参考手册。

render_mode 常见类型有:

  • unshaded:无光照,颜色不受光源影响。
  • cull_disabled:禁用背面剔除。
  • cull_front:剔除正面。
  • cull_back:剔除背面(默认)。
  • depth_draw_always:总是写入深度。
  • depth_draw_opaque:仅不透明时写入深度。
  • depth_draw_never:不写入深度。
  • skip_vertex_transform:跳过顶点变换。
  • shadows_disabled:禁用阴影。
  • diffuse_burley、diffuse_lambert、diffuse_toong:不同漫反射模型。
  • specular_schlick_ggx、specular_blinn、specular_phong、specular_toon:不同高光模型。

具体类型可参考 Godot 官方文档,不同渲染器支持的模式可能略有差异。

此文件夹下有1条笔记。