注:下面的效果都是在ShaderToy网站上进行演示的。
纹理坐标归一化
void mainImage( out vec4 fragColor, in vec2 fragCoord ){
//纹理坐标 (0 ~ 1)
vec2 uv = fragCoord/iResolution.xy;
// fragColor = vec4(uv.x,0.,0.,1.0); //沿X轴方向的颜色渐变 黑到红
fragColor = vec4(uv.y,0.,0.,1.); //沿Y轴方向的颜色渐变 黑到红
}
smoothstep()函数
float c = smoothstep(r,r-blur,d); c在小于(r-blur)的时候等于1,大于r的时候等于0
float c = smoothstep(r-blur,r,d); c在小于(r-blur)的时候等于0,大于r的时候等于1
// 绘制一个圆形
void mainImage( out vec4 fragColor, in vec2 fragCoord ){
vec2 uv = fragCoord/iResolution.xy;
uv -= .5;
//uv 取值为 -0.5 ~ 0.5
uv.x *= iResolution.x / iResolution.y;
float r = length(uv); //sqrt(uv.x * uv.x + uv.y * uv.y) 很多个圆
float c = smoothstep(0.3,0.28,r); // < 0.28 = 1 > 0.3 = 0
//fragColor = vec4(c,0.,0.,1.0);
fragColor = vec4(.8,.2,0.3,0.0) * c; //颜色 * 形状
}
fract()函数
获取小数部分
clamp()函数
函数: clamp(x, min, max)
x : 输入值
min : 最小值
max : 最大值
return : 根据输入的x,返回介于 min 与 max 之间的值。
描述 : 当 x < min时,返回min,当 x > max 时,返回 max
函数原型
template<class T>
T Clamp(T x, T min, T max)
{
if (x > max)
return max;
if (x < min)
return min;
return x;
}
mix()函数
函数接口mix(x, y, level);
x, y : 输入值
level : 插值系数
return : 返回插值结果
描述 : dest = x * (1 - level) + y * level;
vec3 col = vec3(1.0,1.0,0.0) * c1 + vec3(1.0,0.0,0.0) * c2;
fragColor = vec4(vec3(col),1.0);
如果把 "+" 改成 "-",则情况如下:
vec3 col = vec3(1.0,1.0,0.0) * c1 - vec3(1.0,0.0,0.0) * c2;
等同于 =>
vec3 col = vec3(1.0,1.0,0.0) * c1 + vec3(-1.0,-0.0,-0.0) * c2; c2就变为黑色的了
length()函数
dot()函数
dot 表示两个向量的"点"积
vec2 p; //一个二维向量
float r = sqrt(dot(p,p)) = length(p)
表示两个向量的模乘上向量之间的夹角的余弦函数。
atan()函数
函数是正切函数的反函数,即为函数。
vec2 uv = fragCoord/iResolution.xy;
float r = atan(uv.x,1.);
vec3 col = vec3(r);
fragColor = vec4(col,1.0);