数据类型 type
类型 | 说明 | 使用 |
---|---|---|
void | 无返回 | |
bool | 布尔类型 | true/false |
bvec2 | 二维布尔类型 | bvec2(true,false) |
bvec3 | 三维布尔类型 | bvec3(true,false,false) |
bvec4 | 四维布尔类型 | bvec4(true,false,false, true) |
int | 整数 | 1 / 0 / -1 |
ivec2 | 二维整数 | ivec2(1,0) |
ivec3 | 三维整数 | ivec3(1,0,-1) |
ivec4 | 四维整数 | ivec4(1,0,1,-9) |
uint | 非负整数 | 1 / 0 |
uvec2 | 二维非负整数 | uvec2(1,0) |
uvec3 | 三维非负整数 | uvec3(1,0,2) |
uvec4 | 四维非负整数 | uvec4(1,0,2,3) |
float | 浮点数 | 0.652 |
vec2 | 二维浮点数 | vec2(1.0, 0.1) |
vec3 | 三维浮点数 | vec3(1.0, 0.1, 1.1) |
vec4 | 四维浮点数 | vec4(1.0, 0.1, 1.1, 99.0) |
mat2 | 二维矩阵 | [1,2 |
- | - | 3,4] |
mat3 | 三维矩阵 | [1,2,3 |
- | - | 4,5,6 |
- | - | 7,8,9] |
mat4 | 四维矩阵 | [1,2,3,4 |
- | - | 5,6,7,8 |
- | - | 9,10,11,12] |
sampler2D | 2d纹理贴图,读取为float类型 | - |
isampler2D | 2d纹理贴图,读取为int类型 | - |
usampler2D | 2d纹理贴图,读取为uint类型 | - |
samplerCube | 绑定Cubemaps的采样器类型,读取为float类型 | - |
转换
不同类型的值不能直接指定,否则会报错
float a=2;
报错,类型不同
float a=.2;
正确
float a=float(2);
正确,进行类型转换
默认整数数值为有符号类型int,需要定义uint需要进行转换
int a = 2;
正确
uint a = 2;
错误,类型不同
uint a = uint(2);
正确,进行了转换
构造
可以对浮点进行简写,如果没有整数或者小数,可以把那一部分省略,1.0->1. , 0.1->.1 , 0.0->.0
//直接创建
vec4 a = vec4(.0, 1., 2., 3.);
//混合
vec4 a = vec4(vec2(1.,0.), vec2(0.,1.));
vec4 a = vec4(vec3(1.,0.,0.), 1.);
//直接设置单一值
vec3 a = vec4(.0);
矩阵
mat2 m2 = mat2(vec2(1.,0.) vec2(.0,1.));
mat3 m3 = mat3(vec3(1.,.0,.0),vec3(.0,1.,.0),vec3(.0,.0,1.));
mat4 m4 = mat4(1.);
mat3 basic = mat3(WORLD_MATRIX);
mat4 m4 = mat4(basic);
mat2 m2 = mat2(m4);
如果一个大矩阵从一个小矩阵创建出来,那么多出来的空白单位则使用默认值。如果一个矩阵从另一个更大的矩阵上创建,则只获取该矩阵有效范围内的值进行创建
灵活的调用
vec4 a = vec4(.0, 1., 2., 3.);
//获取a的前三个值
vec3 b = a.rgb;
//获得a的第二个值
vec3 c = a.ggg;
//获得a的前三个值的倒叙
vec3 d = a.bgr;
//获得a的前三个值,rgba灯效xyzw
vec3 e = a.xyz;
//无效!!b中不存在第四个值
float f = b.w;
精确度
//8位 0~1的浮点值
lowp float a = 1.0;
//16位 0~1浮点值,float精度的一半
mediump vec2 b = vec2(1.,.0);
//完整浮点值
highp mat2 c = mat2(vec4(.1,.1,.1,.1));
运算符
优先级 | 功能 | 操作符 |
---|---|---|
1 / 最高 | 括号 | () |
2 | 一元运算符 | +, - , !, ~ |
3 | 乘/除 | / , * , % |
4 | 加/减 | +,- |
5 | 位移 | <<, >> |
6 | 比较 | <, >, <=, >= |
7 | 等 | ==, != |
8 | 按位和 | & |
9 | 按位异或 | ^ |
10 | 按位或 | | |
11 | 逻辑和 | && |
12 / 最低 | 逻辑或 | || |
条件和循环
// if and else
if (cond) {
} else {
}
// for loops
for (int i = 0; i < 10; i++) {
}
// while
while (true) {
}
丢弃关键字
片段和灯光功能可以使用 discard 关键字。 如果使用,则丢弃该片段并且不写入任何内容。
函数
in: 表示参数仅用于读取(默认)。
out: 表示该参数只用于写入。
inout: 表示该参数以引用传递。
ret_type func_name(args) {
return ret_type; // if returning a value
}
// a more specific example:
int sum2(int a, int b) {
return a + b;
}
void sum2(int a, int b, inout int result) {
result = a + b;
}
varyingg 关键字
顶点和片段沟通时可以通过这个传递变量
shader_type spatial;
varying vec3 some_color;
void vertex() {
some_color = NORMAL; // Make the normal the color.
}
void fragment() {
ALBEDO = some_color;
}
在着色管线期间内插某些值。 您可以使用 插值限定符 修改这些插值的完成方式。
shader_type spatial;
varying flat vec3 our_color;
void vertex() {
our_color = COLOR.rgb;
}
void fragment() {
ALBEDO = our_color;
}
限定符 | 说明 |
---|---|
flat | 非插值类型 |
smooth | 平滑插值类型(默认) |
uniform 将变量绑定到编辑器界面上
shader_type spatial;
uniform float some_value;
除了编辑器上调节外,gdscript也可以获取和调节这个参数
···
material.get_shader_param("some_value")
material.set_shader_param("some_value", some_value)
···
类型 | 次要类型 | 描述
vec4 | hint_color | 颜色
int,float | hint_range(min,max[step]) | 可设定最大最小值和步长
sampler2D | hint_albedo | 反射贴图,默认白色
sampler2D | hint_black_albedo | 反射贴图,默认黑色
sampler2D | hint_normal | 法线贴图
sampler2D | hint_white | 贴图,默认白色
sampler2D | hint_black | 贴图,默认黑色
sampler2D | hint_aniso | 流程图,默认右
GDScript 数据类型 | GLSL 类型 |
---|---|
bool | bool |
int | int |
float | float |
Vector2 | vec2 |
Vector3 | vec3 |
Color | vec4 |
Transform | mat4 |
Transfrom2D | mat4 |
❌ | 其他 |
! gds控制shader如果出现格式问题不会报错
内建函数
https://blog.csdn.net/hgl868/article/details/7876257