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
相关产品推荐
相关产品推荐

