GLSL 内置函数
max()
返回 x 和 y 中较大的那个。传入向量时,逐个分量比较。
函数签名
float max(float x, float y)
vec2 max(vec2 x, vec2 y)
vec2 max(vec2 x, float y)
vec3 max(vec3 x, vec3 y)
vec3 max(vec3 x, float y)参数
- x
- 第一个值。
- y
- 第二个值。x 是向量时,y 也可以是单个浮点数。
返回值
较大的那个值,类型与 x 相同。
在线示例
修改右侧代码,左侧预览会实时更新。
工作原理
max(x, y) 返回两者中较大的那个。max(0.3, 0.8) 是 0.8。
在有符号距离场里,距离小于 0 表示在图形内部。两个距离取 max 后,只有两个都小于 0 时结果才小于 0,所以示例画出的是两个圆的交集:它们重叠出来的那块透镜形区域。
float d = max(da, db); // 两个图形的交集
常见用法
- 光照不低于 0:
max(dot(normal, lightDir), 0.0)让背光面的光照不会变成负数,几乎每个光照 shader 都有这一行。 - 图形求交:
max(sdfA, sdfB)。 - 从图形里挖掉一块:
max(sdfA, -sdfB)从 A 中减去 B。
常见错误
- 点积外面忘了套
max(..., 0.0),物体背面会出现负光照和发黑的瑕疵。 - 写成
max(x, 0)。GLSL ES 1.0 必须写max(x, 0.0)。