GLSL 的 smoothstep 函数问题,其中 Edge0 大于 Edge1

问题描述 投票:0回答:1

我正在shaders网站上的书上学习GLSL语言。在第 5 页,我看到以下代码。

#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) {    
    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);
    color = (1.0-pct)*color+pct*vec3(0.0,1.0,0.0);

    gl_FragColor = vec4(color,1.0);
}

基本上,代码结果是从白色到黑色的渐变以及从左下角到右上角的绿线。我明白黑色渐变从何而来。但我不明白关于 smoothstep 函数的一些内容,其中edge0大于edge1。我尝试将

abs(st.y - st.x)
的值更改为任何浮点正数示例 0.01。如果我理解正确的话,它应该返回一个大约 0.5 的值。但不知何故,返回值始终是 0.0,因为绿线消失了。谁能帮我理解 smoothstep 函数是如何工作的?

opengl glsl smoothstep
1个回答
0
投票

此代码已损坏。至少在 GLSL 4.4 中,结果是未定义的(spec):

genType smoothstep (genType edge0, genType edge1, genType x)

如果

x <= edge0
,则返回 0.0;如果
x >= edge1
,则返回 1.0 在 0 和 1 之间执行平滑 Hermite 插值 当
edge0 < x < edge1
时。这在以下情况下很有用: 你会想要一个平滑的阈值函数 过渡。这相当于:

genType t;
t = clamp ((x – edge0) / (edge1 – edge0), 0, 1);
return t * t * (3 – 2 * t);

(双打也类似。)

如果

edge0 >= edge1
,则结果未定义。

© www.soinside.com 2019 - 2024. All rights reserved.