shader学习-造型函数
在以下示例中,我们对规范化的x坐标(st.x
)进行可视化。有两种途径:一种是用亮度(度量从黑色到白色的渐变过程),另一种是在顶层绘制一条绿色的线(在这种情况下x
被直接复制给y
)
#ifdef GL_ES
precision mediump float;
#endif
uniform vec2 u_resolution;
uniform vec2 u_mouse;
uniform float u_time;
// Plot a line on Y using a value between 0.0-1.0
float plot(vec2 st) {
//smoothstep作用是生成一个在0.02到0.0区间到线性插值数据,这个数据的图像特性反映出来是(st.y-st.x)
return smoothstep(0.02, 0.0, abs(st.y - st.x));
}
void main() {
vec2 st = gl_FragCoord.xy/u_resolution;
float y = st.x;
vec3 color = vec3(y);
// Plot a line
float pct = plot(st);
//pct为了将取得的区域取反赋值颜色
color = (1.0-pct)*color+pct*vec3(0.0,1.0,0.0);
gl_FragColor = vec4(color,1.0);
}
这些x与y(或亮度)之间的一对一关系称作线性插值,现在起我们可以用一些数学函数改造这些代码行。比如说我们可以做一个求x的5次幂的曲线。
Step和Smoothstep
step()
插值函数需要输入两个参数。第一个是极限或阈值,第二个是我们想要检测或通过的值。对任何小于阈值的值,返回0.0
,大于阈值,则返回1.0
#ifdef GL_ES
precision mediump float;
#endif
#define PI 3.14159265359
uniform vec2 u_resolution;
uniform float u_time;
float plot(vec2 st, float pct){
return smoothstep( pct-0.02, pct, st.y) -
smoothstep( pct, pct+0.02, st.y);
}
void main() {
vec2 st = gl_FragCoord.xy/u_resolution;
// Step will return 0.0 unless the value is over 0.5,
// in that case it will return 1.0
float y = step(0.5,st.x);
vec3 color = vec3(y);
float pct = plot(st,y);
color = (1.0-pct)*color+pct*vec3(0.0,1.0,0.0);
gl_FragColor = vec4(color,1.0);
}
smoothstep()
。当给定一个范围的上下限和一个数值,这个函数会在已有的范围内给出插值。前两个参数规定转换的开始和结束点,第三个是给出一个值用来插值。
在之前的例子中,我们用到smoothstep
在plot()
函数中画了一条绿色的线。这个函数对给出的x轴上的每个值,在特定的y值处制造一个凹凸形变。
- 本文链接:https://archer-lan.github.io/2023/11/20/shader%E5%AD%A6%E4%B9%A0-%E9%80%A0%E5%9E%8B%E5%87%BD%E6%95%B0/
- 版权声明:本博客所有文章除特别声明外,均默认采用 许可协议。