CanvasItem 着色器

画布组件着色器用于绘制Godot中的所有二维元素. 这包括从画布组件继承的所有节点, 以及所有图形用户界面元素.

画布组件着色器比空间着色器包含更少的内置变量和功能, 但它们与顶点, 片段和光处理器功能保持相同的基本结构.

渲染模式

渲染模式

描述

blend_mix

混合混合模式(Alpha 为透明度),默认。

blend_add

叠加混合模式。

blend_sub

减法混合模式。

blend_mul

乘法混合模式。

blend_premul_alpha

预乘 Alpha 混合模式。

blend_disabled

禁用混合,值(包括 Alpha)会按原样写入。

unshaded

结果只使用反照率。材质中不会发生照明/阴影。

light_only

仅在光通过时绘制.

skip_vertex_transform

VERTEX/NORMAL/等需要在顶点函数中手动转换.

内置

标记为 “in” 的值是只读的. 标记为 “out” 的值是可以选择写入的, 不一定包含合理的值. 标记为 “inout” 的值提供一个合理的默认值, 并且可以选择写入. 采样器不是写入的对象, 它们没有被标记.

全局内置

全局内置的功能随处可见, 包括自定义功能.

内置

描述

in float TIME

引擎启动后的全局时间, 以秒为单位(始终为正数). 这取决于翻转(rollover)设置(默认为3600秒). 不受 time_scale 或暂停的影响, 但可以通过调用 VisualServer.set_shader_time_Scale() 来覆盖 TIME 变量的时标, 并将所需的时标因子作为参数( 1.0 为默认值).

顶点内置

顶点数据( VERTEX )是以局部空间(像素坐标, 相对于摄像机)呈现. 如果不写入, 这些值将不会被修改, 并按其来时的样子传递.

用户可以禁用内置的modelview变换(以后仍然会发生投影), 并通过以下代码手动完成:

  1. shader_type canvas_item;
  2. render_mode skip_vertex_transform;
  3. void vertex() {
  4. VERTEX = (EXTRA_MATRIX * (WORLD_MATRIX * vec4(VERTEX, 0.0, 1.0))).xy;
  5. }

备注

WORLD_MATRIX 实际上是一个模型视图矩阵。它接受本地空间的输入并将其转换为视图空间。

为了得到顶点的世界空间坐标, 你必须通过一个自定义uniform值, 如下所示:

  1. material.set_shader_param("global_transform", get_global_transform())

然后, 在你的顶点着色器:

  1. uniform mat4 global_transform;
  2. varying vec2 world_position;
  3. void vertex(){
  4. world_position = (global_transform * vec4(VERTEX, 0.0, 1.0)).xy;
  5. }

world_position 可用于顶点函数或片段函数.

其他内置程序, 如UV和COLOR, 如果没有修改, 也会传递给片段函数.

对于实例化,INSTANCE_CUSTOM变量包含实例自定义数据. 使用粒子时, 此信息通常是:

  • x:旋转角度,单位为弧度。

  • y:生命周期的阶段(0 到 1)。

  • z:动画帧。

内置

描述

in mat4 WORLD_MATRIX

图像空间到视图空间的转换.

in mat4 EXTRA_MATRIX

额外的变换矩阵.

in mat4 PROJECTION_MATRIX

视图空间向裁剪空间变换.

in vec4 INSTANCE_CUSTOM

实例自定义数据.

in bool AT_LIGHT_PASS

如果 true 代表光照通道.

inout vec2 VERTEX

顶点, 在图像空间.

in vec2 TEXTURE_PIXEL_SIZE

默认 2D 纹理的标准化像素大小。对于纹理大小为 64x32px 的 Sprite,TEXTURE_PIXEL_SIZE = vec2(1/64, 1/32)

inout vec2 UV

纹理坐标。

inout vec4 COLOR

来自顶点原语的颜色.

输入vec4 MODULATE

最终调制颜色. 如果使用, COLOR 不会在片段函数后自动调制相乘.

inout float POINT_SIZE

点绘图的点大小.

片段内置

某些节点(例如 Sprite)默认会显示纹理。但是,当自定义片段函数附加到这些节点时,就需要手工完成纹理的查找。Godot 在 COLOR 内置变量中不提供纹理颜色;要读取这些节点的纹理颜色,请使用:

  1. COLOR = texture(TEXTURE, UV);

这与内置法线贴图的行为不同. 如果附加了法线贴图,Godot默认使用它, 并将其值分配给内置的 NORMAL 变量. 如果你使用的是用于3D的法线贴图, 它将出现倒置. 为了在你的着色器中使用它, 必须把它分配给 NORMALMAP 属性.Godot会将其转换为2D使用, 并覆盖 NORMAL .

  1. NORMALMAP = texture(NORMAL_TEXTURE, UV).rgb;

内置

描述

in vec4 FRAGCOORD

像素中心的坐标。在屏幕空间中,xy 表示窗口中的位置,如果没有用 DEPTH,则 z 表示片段深度。原点位于左下角。

inout vec3 NORMAL

NORMAL_TEXTURE 中正常读取. 可写的.

out vec3 NORMALMAP

配置用于三维的法线贴图, 以便在二维中使用. 如果使用, 则覆盖 法线 .

inout float NORMALMAP_DEPTH

用于缩放的法线贴图深度.

in vec2 UV

来自顶点功能的UV.

inout vec4 COLOR

从顶点函数和输出片段颜色. 如果未使用, 将设置为 纹理 颜色.

输入vec4 MODULATE

最终调制颜色. 如果使用, COLOR 不会在片段函数后自动调制相乘.

输入sampler2D TEXTURE

默认的2D纹理.

输入sampler2D NORMAL_TEXTURE

默认 2D 法线纹理。

in vec2 TEXTURE_PIXEL_SIZE

默认 2D 纹理的标准化像素大小。对于纹理大小为 64x32px 的 Sprite,TEXTURE_PIXEL_SIZE = vec2(1/64, 1/32)

in vec2 SCREEN_UV

SCREEN_TEXTURE 一起使用的屏幕UV.

in vec2 SCREEN_PIXEL_SIZE

单个像素的大小. 等于分辨率的倒数.

in vec2 POINT_COORD

所绘制点的坐标。

in bool AT_LIGHT_PASS

如果 true 代表光照通道.

输入sampler2D SCREEN_TEXTURE

屏幕纹理,mipmap包含高斯模糊版本.

内置灯光

光照处理器功能在 2D 中与在 3D 中工作不同。在 CanvasItem 着色器中,这个着色器会为被绘制的对象调用一次,然后再为每一束接触场景中该物体的光调用一次。如果您不希望该对象发生任何光传递,请使用 render_mode unshaded。如果您只想让光通过该对象,使用 render_mode light_only;当您只想让被光覆盖的对象可见时,这是非常有用的。

当着色器处于光通道时,AT_LIGHT_PASS 变量将为 true

内置

描述

in vec4 FRAGCOORD

像素中心的坐标。在屏幕空间中,xy 表示窗口中的位置,如果没有用 DEPTH,则 z 表示片段深度。原点位于左下角。

in vec3 NORMAL

输入正常. 虽然传入了这个值, 但 正常计算仍然发生在此函数之外 .

in vec2 UV

来自顶点函数的UV, 相当于片段函数中的UV.

in vec4 COLOR

输入颜色. 这是片段函数的输出(如果在着色器的任何函数中没有使用 MODULATE , 则应用最终调制).

输入vec4 MODULATE

最终调制颜色. 如果使用, COLOR 不会在片段函数后自动调制相乘.

sampler2D TEXTURE

CanvasItem使用的当前纹理.

in vec2 TEXTURE_PIXEL_SIZE

默认 2D 纹理的标准化像素大小。对于纹理大小为 64x32px 的 Sprite,TEXTURE_PIXEL_SIZE = vec2(1/64, 1/32)

in vec2 SCREEN_UV

SCREEN_TEXTURE 坐标(与屏幕纹理一起使用).

in vec2 POINT_COORD

点精灵的UV.

inout vec2 LIGHT_VEC

从光线到片段的局部坐标向量. 当使用法线贴图时, 它可以被修改以改变光照方向.

inout vec2 SHADOW_VEC

局部坐标中从光到片段的向量. 它可以被修改以改变阴影的计算.

inout float LIGHT_HEIGHT

光照的高度. 只有在使用法线时才有效.

inout vec4 LIGHT_COLOR

光的颜色.

输入vec2 LIGHT_UV

紫外线对质地轻.

out vec4 SHADOW_COLOR

光的阴影颜色.

inout vec4 LIGHT

值从浅色纹理和输出颜色. 可以修改. 如果不使用, 则忽略光照函数.