画布项着色器
画布组件着色器用于绘制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 或暂停的影响,但可以通过调用 |
顶点内置
顶点数据( 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;
}
注解
“世界_矩阵”实际上是一个模型视图矩阵.它接受本地空间中的输入,并将其转换为视图空间.
为了得到顶点的世界空间坐标,你必须通过一个自定义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;
}
“世界_位置”可用于顶点函数或片段函数.
其他内置程序,如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 |
|
输入输出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在”颜色”内置变量中不提供纹理颜色;要读取这些节点的纹理颜色,请使用:
COLOR = texture(TEXTURE, UV);
这与内置法线贴图的行为不同.如果附加了法线贴图,Godot默认使用它,并将其值分配给内置的 NORMAL
变量.如果你使用的是用于3D的法线贴图,它将出现倒置.为了在你的着色器中使用它,必须把它分配给 NORMALMAP
属性.Godot会将其转换为2D使用,并覆盖 NORMAL
.
NORMALMAP = texture(NORMAL_TEXTURE, UV).rgb;
内置 | 描述 |
---|---|
在vec4 FRAGCOORD | 像素中心的坐标.在屏幕空间中.如果”DEPTH”未被使用,则”xy”指定窗口中的位置,”z”表示片段深度.原点在左下角. |
输入输出vec3 NORMAL | |
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 |
|
输入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 | 值从浅色纹理和输出颜色.可以修改.如果不使用,则忽略光照函数. |