shader 函数——sign()

428 阅读2分钟

前言

今天我们来学习 shader 中的常用函数——sign。话不多说,直接开始吧。

dogs-7209506_1280.jpg

sign()

函数意义

根据输入值的大小,返回其正负号。

函数语法

float sign(float x)
vec2 sign(vec2 x)
vec3 sign(vec3 x)
vec4 sign(vec4 x)

函数值域

  • 当 x>0, sign(x)=1.;

  • 当 x=0, sign(x)=0.;

  • 当 x<0, sign(x)=-1.;

  • 同样的道理 vec2/vec3/vec4 也是满足上述特点。例如:sign(vec2 x)

    • 如果 x 分量为正数,则返回 1.0。
    • 如果 x 分量为负数,则返回-1.0。
    • 如果 x 分量为零,则返回 0.0。
    • 例如:vec2(-6.0, 2.0),则 sign(x)将返回 vec2(-1.0, 1.0)。

函数图像

image.png

函数案例

使用 sign 函数画一个圆

sign(d - 0.2):在 d<0.2 范围内小于 0,sign(d-0.2)=-1; 在 d>0.2 范围内小于 0,sign(d-0.2)=1,故可以得到一个 r=0.2 的黑色小圆。

precision mediump float;
uniform vec2 u_resolution;
void main(void) {
  vec2 uv = (gl_FragCoord.xy * 2. - u_resolution.xy) /
            min(u_resolution.x, u_resolution.y); // uv坐标[-1,1]
  float d = length(uv);                          //获取uv上各个点的长度


  gl_FragColor = vec4(vec3(sign(d - 0.2)), 1.0);
}

image.png

使用 sign 画一个四色旗

设置颜色值:

  1. 在第一象限,uv.x>0,uv.y>0,所以 xSign=1,ySign=1,abs(uv.x + uv.y)>0,故颜色为白色的渐变
  2. 在第二象限,uv.x<0,uv.y>0,所以 xSign=-1,ySign=1,abs(uv.x + uv.y)>0,故颜色为绿色的渐变
  3. 在第三象限,uv.x<0,uv.y<0,所以 xSign=-1,ySign=-1,abs(uv.x + uv.y)>0,故颜色为蓝色的渐变
  4. 在第三象限,uv.x>0,uv.y<0,所以 xSign=1,ySign=-1,abs(uv.x + uv.y)>0,故颜色为红色的渐变
void mainImage(out vec4 fragColor, in vec2 fragCoord) {
  // 对当前像素坐标进行调整
  vec2 uv = (fragCoord.xy / iResolution.xy) * 2.0 - 1.0; // uv:[-1,1]

  // 使用sign函数使得颜色值在x和y轴上分别为正或负
  float xSign = sign(uv.x); //在-1,1,0中变换
  float ySign = sign(uv.y); //在-1,1,0中变换


  vec3 color = vec3(xSign, ySign, abs(uv.x + uv.y));

  // 输出颜色值
  fragColor = vec4(color, 1.0);
}

image.png

总结

以上便是 shader——sign 函数的全部内容了,如有错误之处,欢迎大家留言指出,谢谢大家了。