Minecraft着色器中GLSL clamp函数未按预期工作问题排查
问题分析与解决
错误原因
你的代码问题出在整数类型的worldTime直接传入clamp函数:
worldTime是整数类型,而Minecraft中该值的范围通常为0到24000(对应一整个昼夜周期),远大于clamp的上限1.0。- 当整数与浮点数运算时,
worldTime会被隐式转换为浮点数,但只要它≥1,clamp(worldTime, 0.0, 1.0)就会直接返回1.0;仅当worldTime为0时才返回0.0。这导致mix的权重始终是0或1,颜色自然固定不变。
修复方案
需要先将worldTime归一化到0.0-1.0的范围,再进行后续运算。针对Minecraft的昼夜周期,可按以下方式修改:
// 将worldTime转换为0-1的浮点数(对应0到24000的完整昼夜周期) float normalizedTime = worldTime / 24000.0; finalDayColor = mix(vec3(1.00, 0.37, 0.00), vec3(1.00, 0.92, 0.82), clamp(normalizedTime, 0.0, 1.0));
如果仅需要白天时段的颜色过渡,可进一步缩小归一化范围(比如取0到12000的白天周期):
float dayTime = clamp(worldTime / 12000.0, 0.0, 1.0); finalDayColor = mix(vec3(1.00, 0.37, 0.00), vec3(1.00, 0.92, 0.82), dayTime);
内容的提问来源于stack exchange,提问作者010ender
相关产品推荐
相关产品推荐

