游戏开发

Godot Shader笔记:着色器语言( 三)

2019-06-14  本文已影响0人  吃烧烤的老王

原文地址:Docs » Shading » Shading reference » Shading language

精度(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关键字。它将意味着片元被弃用。

上一篇下一篇

猜你喜欢

热点阅读