shader 函数——min()和 max()

550 阅读3分钟

前言

今天我们来学习下 shader 中的 min 函数和 max 函数。话不多说,直接开始吧。

7fe39284616df482_s.jpg

min()

函数意义

返回两个值最小的一个

函数语法

float min(float x, float y)
vec2 min(vec2 x, vec2 y)
vec3 min(vec3 x, vec3 y)
vec4 min(vec4 x, vec4 y)

vec2 min(vec2 x, float y)
vec3 min(vec3 x, float y)
vec4 min(vec4 x, float y)

函数值域

一、我们以最简单的 float min(float x, float y)

举例:min(1.5, 0.5) =0.5; min(-1.5, -0.5) =-1.5;

二、min(vec4 x, vec4 y)

例如:如果 x 是 vec4(1.0, 2.0, 3.0, 4.0),而 y 是 vec4(2.0, 1.0, 4.0, 3.0),则 min(x, y) 的结果将是 vec4(1.0, 1.0, 3.0, 3.0)。

三、vec2 min(vec2 x, float y)

用于比较 vec2 类型的向量,返回它们中每个分量与 float y,值的大小,返回相比较的最小值。

例如:min(vec2(1.0, 2.0),1.5),返回的结果是 vec2(1.0, 1.5)

函数图形

image.png

shader 实例:取两圆相交部分

#ifdef GL_ES
precision mediump float;
#endif

uniform vec2 u_resolution;
uniform float u_time;

void main() {

  vec2 uv = (gl_FragCoord.xy * 2. - u_resolution.xy) /
            min(u_resolution.x, u_resolution.y); // uv:[-1,1]
  float d1 =
      step(length(uv - vec2(.1)), .3); //圆心在(0.1,0.1),半径为0.3的圆
  float d2 =
      step(length(uv - vec2(.2)), .3); //圆形在(0.2,0.2),半径为0.3的圆
  float d = min(d1, d2);
  // gl_FragColor = vec4(vec3(d1 + d2), 1.);
  gl_FragColor = vec4(vec3(d), 1.); //获取相交部分
}

image.png

max()

函数意义

返回两个值最大的一个

函数语法

float max(float x, float y)
vec2 max(vec2 x, vec2 y)
vec3 max(vec3 x, vec3 y)
vec4 max(vec4 x, vec4 y)

vec2 max(vec2 x, float y)
vec3 max(vec3 x, float y)
vec4 max(vec4 x, float y)

函数值域

一、我们以最简单的 float max(float x, float y) 举例:

max(1.5, 0.5) =1.5; max(-1.5, -0.5) =-0.5; max(x, 0.) ={x<0 返回 0;x 大于等于 0 返回 x

二、max(vec4 x, vec4 y)

用于比较两个 vec4 类型的向量,返回它们中每个分量的最大值,即分别比较 x 向量和 y 向量中对应位置上的分量大小,并将每个位置上较小的值作为输出向量的对应分量。

例如,如果 x 是 vec4(1.0, 2.0, 3.0, 4.0),而 y 是 vec4(2.0, 1.0, 4.0, 3.0),则 min(x, y) 的结果将是 vec4(2.0, 2.0, 4.0, 4.0)。

三、vec2 max(vec2 x, float y)

用于比较 vec2 类型的向量,返回它们中每个分量与 float y,值的大小,返回相比较的最大值。例如:max(vec2(1.0, 2.0),1.5),返回的结果是 vec2(1.5, 2.0)

函数图形

image.png

shader 实例

两圆

#ifdef GL_ES
precision mediump float;
#endif

uniform vec2 u_resolution;
uniform float u_time;

void main() {

  vec2 uv = (gl_FragCoord.xy * 2. - u_resolution.xy) /
            min(u_resolution.x, u_resolution.y);
  float d1 = step(length(uv - vec2(.1)), .3);
  float d2 = step(length(uv - vec2(.2)), .3);
  float d = max(d1, d2);
  gl_FragColor = vec4(vec3(d), 1.);
}

image.png

闪动的发光圆

void mainImage(out vec4 fragColor, in vec2 fragCoord) {
  vec2 p = (fragCoord.xy * 2.0 - iResolution.xy) /
           min(iResolution.x, iResolution.y); // uv:[-1,1]
  float r = length(p) + fract(iTime * 0.2);   //添加一个随机变化值

  vec3 color = vec3(max(0.0, 1.0 - r), max(0.0, 1.0 - 2.0 * r),
                    max(0.0, 1.0 - 3.0 * r)); //颜色设定

  fragColor = vec4(color, 1.0);
}

20240603115854_rec_.gif

总结

以上便是关于 shader 中 min 和 max 函数的总结。如有错误之处,欢迎大家留言指出。