精度(Precision)
可以对uniform, variable, argument 以及 varying等数据添加精度修改器(modifier):
lowp vec4 a = vec4(0.0, 1.0, 2.0, 3.0); // 低精度, 每分量8字节并映射到0-1区间
mediump vec4 a = vec4(0.0, 1.0, 2.0, 3.0); // 中等精度,每分量16字节或半长浮点精度
highp vec4 a = vec4(0.0, 1.0, 2.0, 3.0); // 高精度, 全长浮点精度或整型值域(默认)
对于某些运算以损失精度为代价,使用较低精度,可以换取一些数学运算方面的提速。注意:在顶点处理函数(vertex processor function)几乎不会这样做(此时一般都采用高精度),但是在片元处理器中,使用较低精度是很有效的。
记住,以移动设备为主的一些架构,在这个机制上收益匪浅,但也存在一些约束(主要是不同精度间的转换也存在一些计算量)。请阅读针对目标架构的相关文档获取更多信息。不过说实话,移动设备的驱动Bug很多,所以要避免麻烦的话,请使用简单的shader,而不要指定精度,除非你真的需要。
运算符(Operators)
Godot 着色器语言支持和GLSL ES 3.0一样的运算符集。下面是按照优先级(precedence)排序的运算符列表:
优先级 | 类目 | 运算符 |
---|---|---|
1 (最高) | 括号(parenthetical grouping) | () |
2 | 一元运算符(unary) | +, -, !, ~ |
3 | 乘法类(multiplicative) | /, *, % |
4 | 加法类(additive) | +, - |
5 | 按位移动(bit-wise shift) | <<, >> |
6 | 逻辑(relational) | <, >, <=, >=` |
7 | 相等(equality) | ==, != |
8 | 按位与(bit-wise and) | & |
9 | 逻辑异或(bit-wise exclusive or) | ^ |
10 | 按位或(bit-wise inclusive or) | | |
11 | 逻辑与(logical and) | && |
12 (最低) | 逻辑或(logical inclusive or) | || |
分支控制(Flow control)
Godot着色器语言支持大多数常见的过程控制形式:
// if and else
if (cond) {
} else {
}
// for loops
for (int i = 0; i < 10; i++) {
}
// while
while (true) {
}
注意:在现代GPU中,死循环是可以存在的,并且它可能会冻结你的程序(包括编辑器)。Godot无法保护你远离死循环,所以请小心不要犯这种错误。
丢弃(Discarding)
在片元(fragment)和光处理函数中可以使用discard
关键字。它将意味着片元被弃用。
网友评论