我正在浏览GLSL上的Book of Shaders tutorial并尝试使用smoothstep
函数,但是我收到此错误。当我将step
更改为下面的smoothstep
函数时,您可以看到它。
// Author @patriciogv - 2015
// http://patriciogonzalezvivo.com
#ifdef GL_ES
precision mediump float;
#endif
uniform vec2 u_resolution;
uniform vec2 u_mouse;
uniform float u_time;
void main(){
vec2 st = gl_FragCoord.xy/u_resolution.xy;
vec3 color = vec3(0.0);
// bottom-left
vec2 bl = smoothstep(vec2(0.1),st);
float pct = bl.x * bl.y;
// top-right
// vec2 tr = step(vec2(0.1),1.0-st);
// pct *= tr.x * tr.y;
color = vec3(pct);
gl_FragColor = vec4(color,1.0);
}
任何想法如何解决这个问题?
答案 0 :(得分:6)
step
和smootstep
是具有不同签名和行为的2个函数。
虽然step
会在边缘处生成从0到1的硬转换,但smoothstep
会在2个值之间平滑插值。
如Khronos参考文献中所述,smoothstep
有3个参数:
genType smoothstep( genType edge0, genType edge1, genType x );
edge0
指定Hermite函数下边缘的值。edge1
指定Hermite函数上边缘的值。x
指定插值的源值。当
edge0 < x < edge1
时,smoothstep在0和1之间执行平滑的Hermite插值。这在需要具有平滑过渡的阈值函数的情况下非常有用。
相比之下,step
有2个参数:
genType step( genType edge, genType x);
edge
指定步进函数边缘的位置。x
指定用于生成步骤函数的值。
step
通过比较x和edge来生成步进函数 对于返回值的元素i
,返回0.0if x[i] < edge[i]
,否则返回1.0。