Opengl 对于GLSL片段着色器(英特尔HD4000)上的中等大小输入,sin(x)仅返回4个不同的值

Opengl 对于GLSL片段着色器(英特尔HD4000)上的中等大小输入,sin(x)仅返回4个不同的值,opengl,glsl,intel,trigonometry,Opengl,Glsl,Intel,Trigonometry,我用GLSL编写了一个简单的OpenGL 3.3片段着色器。本质上,我是在计算sin(x)对于中等大小的x(介于10000和2000000之间),如下所示: #version 330 out vec4 fColor; void main() { fColor = vec4(sin(gl_FragCoord.x * gl_FragCoord.y)); } 它在我的NVidia图形卡上运行良好,但在我的Intel HD4000上,正弦仅返回四个不同的值(+/-1.0和大约+/-0.3),输入值

我用GLSL编写了一个简单的OpenGL 3.3片段着色器。本质上,我是在计算sin(x)对于中等大小的x(介于10000和2000000之间),如下所示:

#version 330
out vec4 fColor;
void main() {
  fColor = vec4(sin(gl_FragCoord.x * gl_FragCoord.y));
}
它在我的NVidia图形卡上运行良好,但在我的Intel HD4000上,正弦仅返回四个不同的值(+/-1.0和大约+/-0.3),输入值大约为10000

系统:Windows 64位,(英特尔)驱动程序版本15.28.20.64.3347

我的问题:这是一个bug吗?或者这是供应商自由实现正弦函数的一部分?

这是快速三角函数实现中一个相当常见的“错误”——通常使用的近似值适用于(-π,π)范围内的值,但对大值效果不佳


由于GLSL规范不要求这些函数具有任何特定的精度或精密度,因此可以认为,只要sin(x)中的误差远小于| x |就可以了,但这一误差水平似乎过高。

我同意这个答案。尝试使用mod(value,TWO_PI)或等效值,以获得+/-PI范围内的较大值。也可以在英特尔硬件上使用HLSL和sin/cos精度确认此问题。所以这并不局限于GLSL。这只是我使用过的一个最小化的示例,它可以在我的NVidia和ATI图形卡上使用。尽管如此,为了完整性,我还是编辑了版本指令。