CanvasItem明暗器

CanvasItem明暗器用于绘制Godot中的所有二维元素。这些包括继承自canvasitems的所有节点和所有GUI元素。

CanvasItem明暗器比空间明暗器包含更少的内置变量和功能,但它们与顶点、片段和光处理器功能保持相同的基本结构。

渲染模式

渲染模式

描述

blend_mix

混合混合模式(alpha是透明度),默认。

blend_add

添加剂混合模式。

blend_sub

减法混合模式。

blend_mul

乘法混合模式。

blend_premul_alpha

预乘阿尔法混合模式。

blend_disabled

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

无阴影

结果就是反照率。材质中没有照明/阴影。

light_only

仅在光通过时使用。

skip_vertex_transform

顶点/法向/等需要在顶点函数中手动转换。

顶点内置

标记为“in”的值是只读的。标记为“out”的值用于可选写入,不一定包含合理的值。标记为“inout”的值提供了一个合理的默认值,可以选择写入。采样器不是写作主题,也没有标记。

顶点数据 (VERTEX )显示在局部空间(相对于相机的像素坐标)。如果不写入,这些值将不会被修改,并在传入时进行传递。

用户可以禁用内置的ModelView转换(稍后仍将进行投影),并使用以下代码手动进行转换:

shader_type canvas_item;
render_mode skip_vertex_transform;

void vertex() {

    VERTEX = (EXTRA_MATRIX * (WORLD_MATRIX * vec4(VERTEX, 0.0, 1.0))).xy;
}

注解

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

要获得顶点的世界空间坐标,必须按如下方式传递自定义统一体:

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

然后,在顶点明暗器中:

uniform mat4 global_transform;
varying vec2 world_position;

void vertex(){
    world_position = (global_transform * vec4(VERTEX, 0.0, 1.0)).xy;
}

world_position 然后可以在顶点或片段函数中使用。

如果不进行修改,其他内置组件(如UV和Color)也会传递给fragment函数。

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

  • x :以弧度表示的旋转角度。

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

  • z :动画帧。

内置的

描述

在Mat4中 WORLD_MATRIX

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

在Mat4中 EXTRA_MATRIX

额外的转换。

在Mat4中 PROJECTION_MATRIX

视图空间到剪辑空间转换。

在浮动中 TIME

全局时间,以秒为单位。

在vec4中 INSTANCE_CUSTOM

实例自定义数据。

在布尔 AT_LIGHT_PASS

如果这是光通过,则为真。

输入矢量2 VERTEX

顶点,在图像空间中。

在vec2中 TEXTURE_PIXEL_SIZE

默认二维纹理的标准化像素大小。对于质地为64x32px的雪碧, TEXTURE_PIXEL_SIZE = vec2(1/64, 1/32)

输入矢量2 UV

紫外线。

输入矢量4 COLOR

顶点原语的颜色。

输入输出浮动 POINT_SIZE

点绘制的点大小。

片段内置

某些节点(例如, Sprites )默认情况下显示纹理。但是,当自定义片段函数附加到这些节点时,需要手动执行纹理查找。Godot不提供 COLOR 内置变量;要读取此类节点的纹理颜色,请使用:

COLOR = texture(TEXTURE, UV);

这与内置法线贴图的行为不同。如果附加了法线贴图,则godot默认使用该贴图,并将其值指定给内置的 NORMAL 变量。如果您使用的是用于3D的普通地图,它将显示为反转。为了在材质球中使用它,必须将其指定给 NORMALMAP 属性。Godot将处理转换它以用于二维和重写 NORMAL .

NORMALMAP = texture(NORMAL_TEXTURE, UV).rgb;

内置的

描述

在vec4中 FRAGCOORD

像素中心坐标。在屏幕空间。 xy 指定窗口中的位置, z 指定片段深度如果 DEPTH 未使用。原点在左下方。

输入矢量3 NORMAL

正常读取自 NORMAL_TEXTURE . 可写。

输出vec3 NORMALMAP

配置用于3D的普通映射以在2D中使用。如果使用,则覆盖 NORMAL .

输入输出浮动 NORMALMAP_DEPTH

用于缩放的NormalMap深度。

在vec2中 UV

来自顶点的UV函数。

输入矢量4 COLOR

来自顶点函数的颜色和输出片段颜色。如果未使用,将设置为 TEXTURE 颜色。

在sampler2d中 TEXTURE

默认二维纹理。

在sampler2d中 NORMAL_TEXTURE

默认二维普通纹理。

在vec2中 TEXTURE_PIXEL_SIZE

默认二维纹理的标准化像素大小。对于质地为64x32px的雪碧, TEXTURE_PIXEL_SIZE = vec2(1/64, 1/32)

在vec2中 SCREEN_UV

与一起使用的紫外线屏 SCREEN_TEXTURE .

在vec2中 SCREEN_PIXEL_SIZE

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

在vec2中 POINT_COORD

绘图点坐标。

在浮动中 TIME

以秒为单位的全局时间。

在布尔 AT_LIGHT_PASS

如果这是光通过,则为真。

在sampler2d中 SCREEN_TEXTURE

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

轻型内置

光处理器功能在二维中的工作方式与在三维中的工作方式不同。在CanvasItem明暗器中,对要绘制的对象调用一次明暗器,然后对场景中每个与该对象接触的灯光调用一次明暗器。使用渲染模式 unshaded 如果不希望该对象发生任何光通过。使用渲染模式 light_only 如果您只希望该对象发生光通过,当您只希望该对象在被光覆盖的位置可见时,这将非常有用。

当明暗器处于光通道上时, AT_LIGHT_PASS 变量将为 true .

内置的

描述

在vec4中 FRAGCOORD

像素中心坐标。在屏幕空间。 xy 指定窗口中的位置, z 指定片段深度如果 DEPTH 未使用。原点在左下方。

在vec3中 NORMAL

输入正常。尽管传入了此值, 正常计算仍在该函数之外进行 .

在vec2中 UV

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

在vec4中 COLOR

输入颜色。这是应用最终调制的片段函数的输出。

取样器2d TEXTURE

CanvasItem当前使用的纹理。

在vec2中 TEXTURE_PIXEL_SIZE

默认二维纹理的标准化像素大小。对于质地为64x32px的雪碧, TEXTURE_PIXEL_SIZE = vec2(1/64, 1/32)

在vec2中 SCREEN_UV

SCREEN_TEXTURE 坐标(用于屏幕纹理)。

在vec2中 POINT_COORD

点精灵的紫外线。

在浮动中 TIME

以秒为单位的全局时间。

输入矢量2 LIGHT_VEC

从光到碎片的矢量,可以修改以改变阴影计算。

输入输出浮动 LIGHT_HEIGHT

光的高度。仅在使用法线时有效。

输入矢量4 LIGHT_COLOR

光的颜色。

在vec2中 LIGHT_UV

光纹理的UV。

输出vec4 SHADOW_COLOR

光的阴影颜色。

输入矢量4 LIGHT

来自灯光纹理和输出颜色的值。可以修改。如果不使用,则忽略灯光功能。