sin(x)仅为GLSL片段着色器Intel HD4000上的中等大输入返回4个不同的值

Art*_*ind 9 opengl trigonometry intel glsl

我有一个用GLSL编写的简单的OpenGL 3.3片段着色器.从本质上讲,我正在评估sin(x)适度大的x(10,000到2,000,000之间),如下所示:

#version 330
out vec4 fColor;
void main() {
  fColor = vec4(sin(gl_FragCoord.x * gl_FragCoord.y));
}
Run Code Online (Sandbox Code Playgroud)

它在我的NVidia显卡上工作正常,但在我的Intel HD4000上,正弦仅返回四个不同的值(+/- 1.0和大约+/- 0.3),高于大约10,000的输入.

系统:Windows 64bit,(Intel)驱动程序版本15.28.20.64.3347.

我的问题:这是一个错误吗?或者供应商是否可以通过这种方式自由实施正弦?

Chr*_*odd 9

这在快速三角实现中是一个相当常见的"错误" - 它通常使用适用于范围(-π,π)范围内的值的近似值,但对于大值则很差.

由于GLSL规范对这些函数不需要任何特定级别的精度或精度,因此可以认为只要sin(x)中的误差远小于| x | 没关系,但这个级别的错误似乎过多了.

  • 我同意这个答案.尝试使用mod(值,TWO_PI)或等效值来获取+/- PI范围内的大值. (7认同)