着色器

介绍

明暗器是在GPU上运行的独特程序。它们用于指定如何获取网格数据(顶点位置、颜色、法线等)并将其绘制到屏幕上。明暗器不会像普通程序那样处理信息,因为它们是为在GPU上运行而优化的。这样做的一个结果是,明暗器在运行后不保留其数据;它们向屏幕输出最终颜色,然后继续。因此,无法访问上次运行着色器时的颜色输出。

godot使用了一种与glsl非常相似的明暗器语言,但是增加了功能,灵活性稍差。这样做的原因是Godot集成了内置的功能,使得编写复杂的着色器变得非常容易。godot用自己的代码包装用户编写的着色器代码。这样,godot可以处理很多用户不必担心的低级内容,并且它能够解析您的着色器代码并使用它来影响渲染管道。对于更高级的明暗器,可以使用渲染模式关闭此功能。

本文档为您提供了一些特定于godot的关于着色器的信息。有关godot中着色语言的详细参考,请参见 Godot shading language doc .

明暗器类型

Godot明暗器必须指定其用途,而不是为所有用途(二维、三维、粒子)提供通用配置。不同的类型支持不同的渲染模式、内置变量和处理函数。

所有明暗器都需要在第一行中指定其类型,格式如下:

shader_type spatial;

有效类型为:

有关每个阴影类型的详细信息,请参见相应的参考文档。

渲染模式

不同的明暗器类型支持不同的渲染模式。它们是可选的,如果指定,则必须在 shader_type . 渲染模式用于更改处理内置功能的方式。例如,通常使用渲染模式 unshaded 跳过内置的光处理器功能。

渲染模式在明暗器类型下面指定:

shader_type spatial;
render_mode unshaded, cull_disabled;

每个明暗器类型都有不同的渲染模式列表。有关渲染模式的完整列表,请参见每个明暗器类型的文档。

处理器功能

根据明暗器类型,可以选择重写不同的处理器函数。对于“空间”和“画布项”,可以覆盖 vertexfragmentlight . 对于“粒子”,仅适用于 vertex 可以重写。

顶点处理器

这个 vertex 对“空间”和“画布项目”明暗器中的每个顶点调用一次处理函数。对于“粒子”明暗器,对每个粒子都调用一次。

这个 vertex 函数用于修改将传递给片段函数的逐顶点信息。它还可以用来建立变量,这些变量将使用varyings发送到fragment函数(参见其他文档)。

默认情况下,godot将获取顶点信息并相应地将其转换为绘图。如果这是不需要的,可以使用渲染模式自己转换数据;请参见 Spatial shader doc 举个例子。

碎片处理机

这个 fragment 处理功能用于设置每个像素的Godot材料参数。此代码在对象或基元绘制的每个可见像素上运行。它仅在“空间”和“画布项目”明暗器中可用。

fragment函数的标准用法是设置将用于计算照明的材质属性。例如,您可以为 ROUGHNESSRIMTRANSMISSION 它可以告诉光的功能,光是如何对碎片做出反应的。这样就可以在不需要编写大量代码的情况下控制复杂的着色管道。如果您不需要这个内置功能,您可以忽略它并编写自己的光处理功能,Godot将优化它。例如,如果不将值写入 RIM ,Godot不会计算轮辋照明。在编译期间,Godot检查 RIM 使用;如果不使用,它将删除所有相应的代码。因此,您不会在不使用的效果上浪费计算。

光处理器

这个 light 处理器也会按像素运行,但也会针对影响对象的每个灯光运行(如果没有灯光影响对象,则不会运行)。它作为函数存在,在 fragment 处理器,通常在 fragment 功能。

这个 light 处理器在2d中的工作方式与在3d中的工作方式不同;有关如何在每个处理器中工作的说明,请参阅其文档, CanvasItem shadersSpatial shaders ,分别。