2014-01-30 9 views
6

我有一個用GLSL編寫的簡單的OpenGL 3.3片段着色器。sin(x)只對GLSL片段着色器中等大輸入返回4個不同的值,Intel HD4000

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

它工作正常,在我的Nvidia顯卡,但在我的英特爾HD4000正弦只返回四個不同的值:從本質上講,我對中等大的x(10,000 2,000,000之間),這樣的評估sin(x) (+/- 1.0和約+/- 0.3)高於約10,000的輸入。

系統:Windows 64bit,(Intel)驅動程序版本15.28.20.64.3347。

我的問題:這是一個錯誤?或者它是供應商如何以這種方式實現正弦波的自由的一部分?

+0

這只是我用過的最小化的例子,它適用於我的NVidia和ATI顯卡。不過,爲了完整性,我編輯了版本指令。 –

回答

5

這是一個在快速三角實現中相當常見的「bug」 - 它通常使用近似值,該值適用於範圍內的值( - π,π),但對於較大值而言效果不佳。由於GLSL規範並不要求這些函數具有特定的準確度或精確度,所以可以認爲,只要sin(x)中的誤差遠小於| x |它沒問題,但是這個錯誤的程度似乎過高。

+5

我同意這個答案。嘗試使用mod(值,TWO_PI)或等效值來獲得+/- PI範圍內的較大值。 – Dithermaster