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 或暂停的影响, 但可以通过调用 |
顶点内置
顶点数据( 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
实际上是一个模型视图矩阵。它接受本地空间的输入并将其转换为视图空间。
为了得到顶点的世界空间坐标, 你必须通过一个自定义uniform值, 如下所示:
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, 如果没有修改, 也会传递给片段函数.
对于实例化,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 | 如果 |
inout vec2 VERTEX | 顶点, 在图像空间. |
in vec2 TEXTURE_PIXEL_SIZE | 默认 2D 纹理的标准化像素大小。对于纹理大小为 64x32px 的 Sprite,TEXTURE_PIXEL_SIZE = |
inout vec2 UV | 纹理坐标。 |
inout vec4 COLOR | 来自顶点原语的颜色. |
输入vec4 MODULATE | 最终调制颜色. 如果使用, COLOR 不会在片段函数后自动调制相乘. |
inout float POINT_SIZE | 点绘图的点大小. |
片段内置
某些节点(例如 Sprite)默认会显示纹理。但是,当自定义片段函数附加到这些节点时,就需要手工完成纹理的查找。Godot 在 COLOR
内置变量中不提供纹理颜色;要读取这些节点的纹理颜色,请使用:
COLOR = texture(TEXTURE, UV);
这与内置法线贴图的行为不同. 如果附加了法线贴图,Godot默认使用它, 并将其值分配给内置的 NORMAL
变量. 如果你使用的是用于3D的法线贴图, 它将出现倒置. 为了在你的着色器中使用它, 必须把它分配给 NORMALMAP
属性.Godot会将其转换为2D使用, 并覆盖 NORMAL
.
NORMALMAP = texture(NORMAL_TEXTURE, UV).rgb;
内置 | 描述 |
---|---|
in vec4 FRAGCOORD | 像素中心的坐标。在屏幕空间中, |
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 = |
in vec2 SCREEN_UV | 与 SCREEN_TEXTURE 一起使用的屏幕UV. |
in vec2 SCREEN_PIXEL_SIZE | 单个像素的大小. 等于分辨率的倒数. |
in vec2 POINT_COORD | 所绘制点的坐标。 |
in bool AT_LIGHT_PASS | 如果 |
输入sampler2D SCREEN_TEXTURE | 屏幕纹理,mipmap包含高斯模糊版本. |
内置灯光
光照处理器功能在 2D 中与在 3D 中工作不同。在 CanvasItem 着色器中,这个着色器会为被绘制的对象调用一次,然后再为每一束接触场景中该物体的光调用一次。如果您不希望该对象发生任何光传递,请使用 render_mode unshaded
。如果您只想让光通过该对象,使用 render_mode light_only
;当您只想让被光覆盖的对象可见时,这是非常有用的。
当着色器处于光通道时,AT_LIGHT_PASS
变量将为 true
。
内置 | 描述 |
---|---|
in vec4 FRAGCOORD | 像素中心的坐标。在屏幕空间中, |
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 = |
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 | 值从浅色纹理和输出颜色. 可以修改. 如果不使用, 则忽略光照函数. |