Shaders

简介

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

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

这个文档为您提供了一些特定于Godot的着色器的信息。有关Godot中着色语言的详细信息,请参见:ref:Godot着色语言文档<doc_shading_language>

Shader types

Instead of supplying a general purpose configuration for all uses (2D, 3D, particles), Godot shaders must specify what they are intended for. Different types support different render modes, built-in variables, and processing functions.

All shaders need to specify their type in the first line, in the following format:

shader_type spatial;

有效的类型有:

有关每种着色类型的详细信息,参见相应的参考文档。

Render modes

Different shader types support different render modes. They are optional and, if specified, must be after the shader_type. Render modes are used to alter the way built-in functionality is handled. For example, it is common to use the render mode unshaded to skip the built-in light processor function.

渲染模式在着色器类型下面指定:

shader_type spatial;
render_mode unshaded, cull_disabled;

每种着色器类型都有不同的渲染模式列表。有关渲染模式的完整列表,请参阅每种着色器类型的文档。

Processor functions

Depending on the shader type, different processor functions may be optionally overridden. For “spatial” and “canvas_item”, it is possible to override vertex, fragment, and light. For “particles”, only vertex can be overridden.

Vertex processor

The vertex processing function is called once for every vertex in “spatial” and “canvas_item” shaders. For “particles” shaders, it is called once for every particle.

“顶点”函数用于修改传递给片段函数的每个顶点信息。也可用于建立变量,这些变量将通过使用变量发送到片段函数(请参见“其他文档”)。

默认情况下,Godot将获取您的顶点信息,并相应地对其进行转换以便绘制。如果这是不可用的,您可以使用渲染模式转换数据;查看:ref:`空间着色器文档 <doc_spatial_shader>`来获得这个示例。

Fragment processor

The fragment processing function is used to set up the Godot material parameters per pixel. This code runs on every visible pixel the object or primitive draws. It is only available in “spatial” and “canvas_item” shaders.

分段函数的标准用法是设置用于计算光照的材质属性。例如,你可以设置“粗糙度”、“边缘”或“传递”的值,可以告诉光照功能,以及光照对这个片段的响应。这使得控制复杂的着色管道成为可能,而无需用户编写太多代码。如果你不需要这个内置功能,可以忽略它,编写自己的光照处理函数,Godot会优化它。例如,如果你不给“边缘”设定一个值,Godot将不计算边缘照明。编译期间,Godot检查是否使用了“边缘”;如果没有,它将删除所有对应的代码。因此,您不会将计算力浪费在不使用的效果上。

Light processor

The light processor runs per pixel too, but also runs for every light that affects the object (and does not run if no lights affect the object). It exists as a function called inside the fragment processor and typically operates on the material properties setup inside the fragment function.

“光照”处理器在二维和三维环境下的工作方式不同;要了解它如何在每种情况下工作,请分别查阅文档:ref:画布组件着色器 <doc_canvas_item_shader>`以及:ref:`空间着色器 <doc_spatial_shader>