Floating point 对于具有大参数的三角函数,着色器的执行非常不一致

Floating point 对于具有大参数的三角函数,着色器的执行非常不一致,floating-point,glsl,shader,overflow,hlsl,Floating Point,Glsl,Shader,Overflow,Hlsl,我制作此着色器是为了调试此问题: void主图像(输出vec4 fragColor,输入vec2 fragCoord) { vec3 col=vec3(分形(vec2(100000.0f,200000.0f)*sin((iMouse.xy+iResolution.xy)*vec2(100000.0f,200000.0f))),0.0f; fragColor=vec4(col,1.0); } 如果您只是让该着色器在背景中的NVidia上运行一段时间,您可能会注意到它生成的随机颜色有时会闪烁为不同

我制作此着色器是为了调试此问题:

void主图像(输出vec4 fragColor,输入vec2 fragCoord)
{
vec3 col=vec3(分形(vec2(100000.0f,200000.0f)*sin((iMouse.xy+iResolution.xy)*vec2(100000.0f,200000.0f))),0.0f;
fragColor=vec4(col,1.0);
}
如果您只是让该着色器在背景中的NVidia上运行一段时间,您可能会注意到它生成的随机颜色有时会闪烁为不同的颜色,即使输入没有更改。当您打开“开始”菜单、浏览互联网、在另一个窗口中键入文本等时,它可能会开始闪烁。有时,当您什么都不做时,它可能会快速闪烁

在AMD上,此着色器仅输出黑色

问题同样会在D3D11渲染器和Vulkan渲染器上重现


该着色器的重要部分是计算一个非常大的值(>1e6)的sin()。当然,人们可能会对这种操作的精度提出质疑,但我希望它至少是稳定的,而且我无法解释它是如何开始振荡的。欢迎对正在发生的事情进行任何详细说明。

所谓“稳定”,您的意思是希望函数从相同的输入中产生相同的输出,还是希望函数从变化不大的输入中产生变化不大的输出?你知道有没有过这样的情况:你传递的
sin
输入完全相同,但输出却不同?