原文地址: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就是做你目前看到的这些工作,它们计算VERTEX
和COLOR
。你可以设计出更复杂的数学策略来给那些变量赋值。
想要汲取灵感,请看一些关于Shader的高级教程,或者看一写其它的网站Shadertoy 以及 The Book of Shaders