数据类型 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如果出现格式问题不会报错
内建函数
函数 | 说明 |
---|---|
vec_type radians(vec_type) | 角度转弧度 |
vec_type degrees(vec_type) | 弧度转角度 |
vec_type sin(vec_type) | 输出正弦值 |
vec_type cos(vec_type) | 输出余弦值 |
vec_type tan(vec_type) | 输出正切值 |
vec_type asin(vec_type) | 输出反正弦值 |
vec_type acos(vec_type) | 输出反余弦值 |
vec_type atan(vec_type) | 输出反正切值 |
vec_type atan(vec_type x, vec_type y) | 转换成反正切值,通过向量转换成角度 |
vec_type sinh(vec_type) | 双曲正弦 |
vec_type cosh(vec_type) | 双曲余弦 |
vec_type tanh(vec_type) | 双曲正切 |
vec_type asinh(vec_type) | 反双曲正弦 |
vec_type acosh(vec_type) | 反双曲余弦 |
vec_type atanh(vec_type) | 反双曲正切 |
vec_type pow(vec_type) | 幂 |
vec_type exp(vec_type) | e为底的指数 |
vec_type exp2(vec_type) | 2为底指数 |
vec_type log(vec_type) | 自然对数 |
vec_type log2(vec_type) | 2为底对数 |
vec_type sqrt(vec_type) | 平方根 |
vec_type inversesqrt(vec_type) | 反平方根 |
vec_type abs(vec_type) | 绝对值 |
vec_int_type abs(vec_int_type) | 绝对值 |
vec_type sign(vec_type) | 符号 |
vec_int_type sign(vec_int_type) | 符号 |
vec_type floor(vec_type) | 向下取整 |
vec_type round(vec_type) | 四舍五入 |
vec_type roundEven(vec_type) | 最近的偶数 |
vec_type trunce(vec_type) | 截断,直接取得整数部分 |
vec_type ceil(vec_type) | 向上取整 |
vec_type fract(vec_type) | 取小数部分 |
vec_type mod(vec_type, vec_type) | 取余 |
vec_type mod(vec_type, float) | 取余 |
vec_type modf(vec_type, out vec_type i) | 拆分整数和小数,函数返回小数,i返回整数部分 |
vec_scalar_type min(vec_scalar_type a, vec_scalar_type b) | 最小值 |
vec_scalar_type max(vec_scalar_type a, vec_scalar_type b) | 最大值 |
vec_scalar_type clamp(vec_scalar_type value, vec_scalar_type min, vec_scalar_type max) | 获得在min~max之间的value值 |
vec_type mix(vec_type a, vec_type b, float c) | 线性插值 y = (b-a)*c+a |
vec_type mix(vec_type a, vec_type b, vec_type c) | 线性插值 |
vec_type mix(vec_type a, vec_type b, bool c) | 线性插值 |
vec_type mix(vec_type a, vec_type b, vec_bool_type c) | 线性插值 |
vec_type step(vec_type a, vec_type b) | 每个单元=b内每个值<a内每个值 ? 0.0 : 1.0 |
vec_type step(float a, vec_type b) | 每个单元=b内每个值<a ? 0.0 : 1.0 |
vec_type smoothstep(vec_type a, vec_type b, vec_type c) | 埃尔米特插值, 每个单元=0~1之间的平滑值, a,b为阀值 |
vec_type smoothstep(float a, float b, vec_type c) | 埃尔米特插值 |
vec_bool_type isnan ( vec_type ) | 是否无效值? |
vec_bool_type isinf ( vec_type ) | 是否为无穷值? |
vec_int_type floatBitsToInt ( vec_type ) | Float-> Int位复制,无转换 |
vec_uint_type floatBitsToUint( vec_type ) | Float-> UInt位复制,无转换 |
vec_type intBitsToFloat ( vec_int_type ) | Int-> Float位复制,无转换 |
vec_type uintBitsToFloat ( vec_uint_type ) | UInt->浮点复制,无转换 |
float length ( vec_type ) | 向量长度 |
float distance ( vec_type, vec_type ) | 向量之间的距离 |
float dot ( vec_type, vec_type ) | 点积 |
vec3 cross ( vec3, vec3 ) | 叉积 |
vec_type normalize ( vec_type ) | 标准化为单位长度 |
vec3 reflect ( vec3 I, vec3 N ) | 反射 |
vec3 refract(vec3 I,vec3 N,float eta) | 折射 |
vec_type faceforward ( vec_type N, vec_type I, vec_type Nref ) | If dot(Nref, I) < 0, return N, otherwise –N |
mat_type matrixCompMult( mat_type, mat_type ) | 矩阵分量乘法 |
mat_type outerProduct ( vec_type, vec_type ) | 矩阵外积 |
mat_type transpose ( mat_type ) | 转置矩阵 |
float determinant ( mat_type ) | 矩阵行列式 |
mat_type inverse ( mat_type ) | 逆矩阵 |
vec_bool_type lessThan ( vec_scalar_type, vec_scalar_type ) | Bool向量cmp on <int / uint / float vectors |
vec_bool_type greaterThan ( vec_scalar_type, vec_scalar_type ) | Bool向量cmp on> int / uint / float向量 |
vec_bool_type lessThanEqual ( vec_scalar_type, vec_scalar_type ) | Bool vector cmp on <= int/uint/float vectors |
vec_bool_type greaterThanEqual ( vec_scalar_type, vec_scalar_type ) | Bool vector cmp on >= int/uint/float vectors |
vec_bool_type equal ( vec_scalar_type, vec_scalar_type ) | Bool vector cmp on == int/uint/float vectors |
vec_bool_type notEqual ( vec_scalar_type, vec_scalar_type ) | Bool vector cmp on != int/uint/float vectors |
bool any ( vec_bool_type ) | 任何单元是真时返回真 |
bool all( vec_bool_type ) | 所有单元都是真时返回真 |
bool not ( vec_bool_type ) | 有单元为假时返回真 |
ivec2 textureSize ( sampler2D_type s, int lod ) | 获取纹理的大小 |
ivec2 textureSize ( samplerCube s, int lod ) | 获取立方体贴图的大小 |
vec4_type texture ( sampler2D_type s, vec2 uv [, float bias] ) | 执行2D纹理读取 |
vec4_type texture ( samplerCube s, vec3 uv [, float bias] ) | 执行立方纹理读取 |
vec4_type textureProj ( sampler2D_type s, vec3 uv [, float bias] ) | 使用投影执行纹理读取 |
vec4_type textureProj ( sampler2D_type s, vec4 uv [, float bias] ) | 使用投影执行纹理读取 |
vec4_type textureLod ( sampler2D_type s, vec2 uv, float lod ) | 在自定义mipmap上执行2D纹理读取 |
vec4_type textureLod ( samplerCube s, vec3 uv, float lod ) | 执行立方织构的自定义纹理贴图读取 |
vec4_type textureProjLod ( sampler2D_type s, vec3 uv, float lod ) | 使用projection / lod执行纹理读取 |
vec4_type textureProjLod ( sampler2D_type s, vec4 uv, float lod ) | 使用projection / lod执行纹理读取 |
vec4_type texelFetch ( sampler2D_type s, ivec2 uv, int lod ) | 使用整数坐标获取单个纹素 |
vec_type dFdx ( vec_type ) | 使用局部差分在x中导数 |
vec_type dFdy ( vec_type ) | 使用局部差分在y中导数 |
vec_type fwidth ( vec_type ) | x和y的绝对导数之和 |