Godot Shader笔记:2D着色器(一)
原文地址:Docs » Shading » Shading reference » CanvasItem shaders
译者注:直译为画布元素着色器下文中将意译成2D着色器
2D着色器(CanvasItem shaders)
2D着色器用于绘制Godot中的所有的2D元素,包括所有继承于CanvasItem的节点以及所有的GUI元素。
相对于3D着色器,2D着色器要简单一些,内置函数也比较少,但是2D和3D着色器的基础结构是相同的,都包顶点函数(vertex
),片元函数(fragment
)及光(light
)函数
渲染模式画布元素
渲染模式 | 描述 |
---|---|
blend_mix |
Mix blend mode (alpha is transparency), default. |
blend_add |
Additive blend mode. |
blend_sub |
Subtractive blend mode. |
blend_mul |
Multiplicative blend mode. |
blend_premul_alpha |
Pre-multiplied alpha blend mode. |
blend_disabled |
Disable blending, values (including alpha) are written as-is. |
unshaded |
Result is just albedo. No lighting/shading happens in material. |
light_only |
Only draw on light pass. |
skip_vertex_transform |
VERTEX/NORMAL/etc need to be transformed manually in vertex function. |
译者注:vertex built-in,fragment built-in 以及 light built-in根据其实际作用分别被意译为内置顶点属性,内置片元属性以及内置光属性,"属性"一词借用C#中的属性即property,其实就是getter和setter
内置顶点属性(vertex built-ins)
当值注明为in
时,意味着只读,当值注明为out
时,意味着可以选择性地写入,但是并不一定提供一个有效值。当值注明为inout
时,它会提供一个有效的默认值,并且可以选择性地写入。采样器(sampler)不是可写对象,它们也没有被标记。
顶点数据(VERTEX)使用局部坐标表示(相对于摄像机的像素坐标),如果不改写的话,它们的值会原封不动地传递出去。
用户可以关闭内置模型视图变换(英文:modelview transform,注:但投影(projection)依然会发生),并使用如下代码手动实现:
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: Rotation angle in radians.
-
y: Phase during lifetime (0 to 1).
-
z: Animation frame.
内置顶点属性 | 描述 |
---|---|
in mat4 WORLD_MATRIX |
图片空间(Image space)到视图空间(view space)的变换 |
in mat4 EXTRA_MATRIX |
Extra transform. |
in mat4 PROJECTION_MATRIX |
View space to clip space transform. |
in float TIME |
Global time, in seconds. |
in vec4 INSTANCE_CUSTOM |
Instance custom data. |
in bool AT_LIGHT_PASS |
True if this is a light pass. |
inout vec2 VERTEX |
Vertex, in image space. |
in vec2 TEXTURE_PIXEL_SIZE |
Normalized pixel size of default 2D texture. For a Sprite with a texture of size 64x32px, TEXTURE_PIXEL_SIZE = vec2(1/64, 1/32) |
inout vec2 UV |
UV. |
inout vec4 COLOR |
Color from vertex primitive. |
inout float POINT_SIZE |
Point size for point drawing. |