游戏开发

Godot Shader笔记:2D着色器(一)

2019-06-17  本文已影响0人  吃烧烤的老王

原文地址: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 了。

诸如 UVCOLOR等一些内置成员,如果不加修改的话也会被传入片元函数。例如,INSTANCE_CUSTOM变量包含着实例的自定义数据。在粒子中,这些数据往往如下所示:

内置顶点属性 描述
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.
上一篇下一篇

猜你喜欢

热点阅读