Godot Shader笔记:你的第一个2D Shader(三)

原文地址:Docs » Shading » Your first shader » Your first CanvasItem shader

使用Uniform变量

uniform变量用于在这个Shader中传递数据。(译者注:实际上有点类似于序列化的成员变量)

你可以在Shader的顶部按如下方式声明uniform变量:

uniform float size;

要获取更多用法请阅读Shading Language doc

添加一个uniform变量来给便Sprite中的blue值。

uniform float blue = 1.0; // 可以对uniform指定一个默认值
​
void fragment(){
 COLOR = texture(TEXTURE, UV); //读取纹理
 COLOR.b = blue;
}

现在,你可以在编辑器中修改Sprite的blue值了。在检视面板你创建的这个Shader下面,有一个Shader Param。展开这个折叠的部分,你将看到你刚刚声明的uniform变量。如果你修改这个值,他将覆盖掉你提供的默认值。

代码和Shader的交互

你可以在代码中通过节点的material资源来调用set_shader_param()以修改uniform变量的值。以Sprite节点为例,如下代码可以修改blue的值:

var blue_value = 1.0
material.set_shader_param("blue", blue_value)

注意:uniform的名字是一个字符串。这个字符串必须和Shader中的uniform变量名完全一样,包括大小写。

你的第一个顶点函数(vertex function)

现在,我们已经有了一个片元函数,让我们写一个顶点函数吧。

使用顶点函数计算每个顶点应该绘制到屏幕的哪个区域。

VERTEX是顶点函数中最重要的内置属性。最初,它指定模型中顶点的坐标,但你也可以改写它,来决定最终在哪里绘制顶点。VERTEX是一个vec2类型变量,它最初以局部坐标表示(即,不依赖于摄像机,视口以及父节点)。

你可以直接给VERTEX增加偏移量来偏移顶点。

void vertex() {
 VERTEX += vec2(10.0, 0.0);
}

结合内置属性TIME,甚至还可以实现简单的动画。

void vertex() {
 // 让这个Sprite以自身位置为中心绕圈运动
 VERTEX += vec2(cos(TIME)*100.0, sin(TIME)*100.0);
}
总结

本质上,Shader就是做你目前看到的这些工作,它们计算VERTEXCOLOR。你可以设计出更复杂的数学策略来给那些变量赋值。

想要汲取灵感,请看一些关于Shader的高级教程,或者看一写其它的网站Shadertoy 以及 The Book of Shaders

你可能感兴趣的:(Godot Shader笔记:你的第一个2D Shader(三))