画布项着色器

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

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

渲染模式

渲染模式

描述

blendmix

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

blend_add

添加剂混合模式.

blend_sub

减法混合模式.

blend_mul

乘法混合模式.

blend_premul_alpha

预乘alpha混合模式.

混合禁用

禁用混合,值(包括透明通道)按原样编写.

unshaded

结果只是反射. 材质中不会发生照明/阴影.

light_only

仅在光通过时绘制.

skip_vertex_transform

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

内置

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

全局内置

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

内置

描述

in float TIME

引擎启动后的全局时间,以秒为单位(始终为正数).这取决于翻转设置(默认为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. }

注解

“世界_矩阵”实际上是一个模型视图矩阵.它接受本地空间中的输入,并将其转换为视图空间.

为了得到顶点的世界空间坐标,你必须通过一个自定义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. }

“世界_位置”可用于顶点函数或片段函数.

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

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

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

  • ** y**: 寿命期间的相位(0到1).

  • ** z**: 动画帧.

内置

描述

在mat4 WORLD_MATRIX

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

in mat4 EXTRA_MATRIX

额外的转变.

in mat4 PROJECTION_MATRIX

查看空间以剪切空间变换.

in vec4 INSTANCE_CUSTOM

实例自定义数据.

in bool AT_LIGHT_PASS

true 如果是光通道.

输入输出vec2 VERTEX

顶点,在图像空间.

in vec2 TEXTURE_PIXEL_SIZE

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

输入输出vec2 UV

下一个坐标.

输入输出vec4 COLOR

来自顶点原语的颜色.

输入vec4 MODULATE

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

输入输出float POINT_SIZE

点绘图的点大小.

片段内置

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

  1. COLOR = texture(TEXTURE, UV);

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

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

内置

描述

在vec4 FRAGCOORD

像素中心的坐标.在屏幕空间中.如果”DEPTH”未被使用,则”xy”指定窗口中的位置,”z”表示片段深度.原点在左下角.

输入输出vec3 NORMAL

NORMAL_TEXTURE 中正常读取.可写的.

out vec3 NORMALMAP

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

输入输出float NORMALMAP_DEPTH

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

in vec2 UV

来自顶点功能的UV.

输入输出vec4 COLOR

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

输入vec4 MODULATE

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

输入sampler2D TEXTURE

默认的2D纹理.

输入sampler2D NORMAL_TEXTURE

默认2D普通纹理.

in vec2 TEXTURE_PIXEL_SIZE

默认2D纹理的标准化像素大小. 对于纹理大小为64x32px的Sprite, TEXTURE_PIXEL_SIZE =:code: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包含高斯模糊版本.

内置灯光

光照处理器功能在二维中与在三维中工作不同.在画布组件着色时,着色器为被绘制的对象调用一次,然后每一束光接触场景中的物体一次.如果您不希望该对象发生任何光传递,请使用渲染_模式中的”无阴影”.如果您只想让光通过该对象,使用渲染_模式中的”仅有_光照”;当您只想让被光覆盖的对象可见时,这是非常有用的.

当着色器处于光通道时,”在_光照_通道”变量将为”真”.

内置

描述

在vec4 FRAGCOORD

像素中心的坐标.在屏幕空间中.如果”DEPTH”未被使用,则”xy”指定窗口中的位置,”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 =:code:vec2(1 / 64,1 / 32)

in vec2 SCREEN_UV

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

in vec2 POINT_COORD

点精灵的UV.

输入输出vec2 LIGHT_VEC

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

输入输出vec2 SHADOW_VEC

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

输入输出float LIGHT_HEIGHT

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

输入输出vec4 LIGHT_COLOR

光的颜色.

输入vec2 LIGHT_UV

紫外线对质地轻.

out vec4 SHADOW_COLOR

光的阴影颜色.

输入输出vec4 LIGHT

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