You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GLSL技术问询:如何限制u_time在0.5-1.0区间并结合sin函数使用?

解决GLSL中u_time范围限制(0.5-1.0)并结合sin函数的问题

要将u_time约束在0.5-1.0区间并结合sin函数使用,你可以通过两种方式实现,以下针对你的代码给出具体修改方案:

方案1:将u_time循环限制在0.5-1.0区间后再取sin

先把u_time处理成0-1的循环值,再线性映射到0.5-1.0区间,最后代入sin函数:

void main() {
    vec2 uv = gl_FragCoord.xy / u_resolution.xy * 10.0;
    
    vec3 color = vec3(0.0);
    
    // 把u_time转为0-1循环的时间值,再映射到0.5-1.0区间
    float cyclic_time = fract(u_time);
    float restricted_time = mix(0.5, 1.0, cyclic_time);
    float wave_width = sin(restricted_time); // 这里使用限制后的时间
    
    uv.y -= 4.0;
    
    uv.y += (0.2 * sin(uv.x + u_time));
    wave_width *= abs(1.0 / (10.0 * uv.y));
    color += vec3(wave_width, 0.0 , 0.0);
    
    gl_FragColor = vec4(color, 1.0);
}

方案2:将sin(u_time)的结果映射到0.5-1.0区间

如果你的需求是让sin函数的输出落在0.5-1.0(而非限制u_time本身),可以利用sin的取值范围(-1到1)做线性映射:

void main() {
    vec2 uv = gl_FragCoord.xy / u_resolution.xy * 10.0;
    
    vec3 color = vec3(0.0);
    
    // 先计算sin值,再将-1~1的范围映射到0.5~1.0
    float sin_val = sin(u_time);
    float wave_width = mix(0.5, 1.0, (sin_val + 1.0) * 0.5);
    
    uv.y -= 4.0;
    
    uv.y += (0.2 * sin(uv.x + u_time));
    wave_width *= abs(1.0 / (10.0 * uv.y));
    color += vec3(wave_width, 0.0 , 0.0);
    
    gl_FragColor = vec4(color, 1.0);
}

关键代码说明

  • fract(u_time):取u_time的小数部分,让时间在0-1之间无限循环,避免时间持续增长超出范围。
  • mix(a, b, t):线性插值函数,当t在0-1时,返回从a到b的插值结果,实现区间映射。
  • (sin_val + 1.0) * 0.5:将sin的-11范围转换为01,再通过mix映射到0.5~1.0区间。

内容的提问来源于stack exchange,提问作者Yerbs

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 04:02:45