Godot Shader 02-语法

数据类型 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的绝对导数之和

https://blog.csdn.net/hgl868/article/details/7876257

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,444评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,421评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,363评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,460评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,502评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,511评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,280评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,736评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,014评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,190评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,848评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,531评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,159评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,411评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,067评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,078评论 2 352

推荐阅读更多精彩内容