前言
今天我们来学习下 shader 中的 min 函数和 max 函数。话不多说,直接开始吧。
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)
函数图形
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.); //获取相交部分
}
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)
函数图形
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.);
}
闪动的发光圆
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);
}
总结
以上便是关于 shader 中 min 和 max 函数的总结。如有错误之处,欢迎大家留言指出。