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)。

相关函数

用到 max() 的教程