前言
今天我们来学习 shader 中的常用函数——sign。话不多说,直接开始吧。
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)。
函数图像
函数案例
使用 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);
}
使用 sign 画一个四色旗
设置颜色值:
- 在第一象限,uv.x>0,uv.y>0,所以 xSign=1,ySign=1,abs(uv.x + uv.y)>0,故颜色为白色的渐变
- 在第二象限,uv.x<0,uv.y>0,所以 xSign=-1,ySign=1,abs(uv.x + uv.y)>0,故颜色为绿色的渐变
- 在第三象限,uv.x<0,uv.y<0,所以 xSign=-1,ySign=-1,abs(uv.x + uv.y)>0,故颜色为蓝色的渐变
- 在第三象限,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);
}
总结
以上便是 shader——sign 函数的全部内容了,如有错误之处,欢迎大家留言指出,谢谢大家了。