2014-01-30 14 views
6

Ich habe einen einfachen OpenGL 3.3 Fragment Shader in GLSL geschrieben. Im Grunde bin ich der Bewertung sin(x) für mäßig große x (zwischen 10.000 und 2.000.000), etwa so:sin (x) gibt nur 4 verschiedene Werte für moderat große Eingabe auf GLSL Fragment Shader, Intel HD4000

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

Es funktioniert gut auf meine NVidia-Grafikkarte, aber auf meinem Intel HD4000 die Sinus gibt nur vier verschiedene Werte (+/- 1.0 und um +/- 0,3) über einem Eingang von ungefähr 10.000.

System: Windows 64 Bit, (Intel) Treiberversion 15.28.20.64.3347.

Meine Fragen: Ist das ein Fehler? oder ist es Teil der Freiheit des Verkäufers, den Sinus so zu implementieren?

+0

Dies war nur ein minimiertes Beispiel von dem, was ich verwendet habe und es funktioniert auf meinen NVidia und ATI Grafikkarten. Trotzdem habe ich die Versionsrichtlinie der Vollständigkeit halber überarbeitet. –

Antwort

5

Dies ist ein ziemlich häufiger "Bug" in schnellen trigonometrischen Implementierungen - es ist üblich, eine Approximation zu verwenden, die gut für Werte im Bereich (- π, π) funktioniert, aber schlecht für große Werte.

Da die GLSL-Spezifikation für diese Funktionen keine bestimmte Genauigkeit oder Genauigkeit erfordert, kann argumentiert werden, dass der Fehler in sin (x) viel kleiner ist als | x | es ist in Ordnung, aber dieses Maß an Fehler scheint übertrieben.

+5

Ich stimme dieser Antwort zu. Versuchen Sie, mod (value, TWO_PI) oder einen gleichwertigen Wert zu verwenden, um Ihre großen Werte im Bereich von +/- PI zu erhalten. – Dithermaster