Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Die SINCOS-Anweisung berechnet Sinus und Kosinus im Bogenmaß. Die X-Komponente des Ergebnisses enthält cos(x); die Y-Komponente enthält sin(x).
Format
Anweisungstoken , das D3DSIO_SINCOS enthält. Die Anweisungslänge beträgt 4.
Zielparametertoken mit dem D3DSPR_TEMP Registertyp.
erstes Quellparametertoken. Erfordert die explizite Verwendung von replizieren swizzle, d. h., es muss die Swizzle-Komponente X, Y, Z oder W (oder die Äquivalente R, G, B oder A) angegeben werden.
Die folgenden Quelltoken gelten für Pixel- und Vertexshaderversionen vor 3_0. Das heißt, für Pixel- und Vertexshader Version 3_0 und höher wird nur das erste Quellparametertoken verwendet.
zweites Quellparametertoken mit dem D3DSPR_TEMP Registertyp.
drittes Quellparametertoken, das den D3DSPR_TEMP Registertyp verwendet.
Kommentare
Die zweite und dritte Quelle könnten als temporäre Register verwendet werden.
Quellregisterregeln:
src1. selected_channel ist ein Winkel, der im Bogenmaß zwischen -Pi und +Pi gemessen wird.
src2 = (âˆ'1.f/(7!*128), âˆ'1.f/(6!*64), 1.f/(4!*16), 1.f/(5!*32) ).
src3 = (âˆ'1.f/(3!*8), âˆ'1.f/(2!*8), 1.f, 0.5f).
Die Reihenfolge der letzten beiden Zahlen in src2 und src3 wird speziell für den Pixelshader 2.0 ausgewählt, der auch über das SINCOS-Makro verfügt. Das Umkehren dieser Zahlen bedeutet, dass die Makroerweiterung einen der wenigen benutzerdefinierten Quellschwister verwenden kann, der für ps_2_0 verfügbar ist (Vertexshader weisen allgemeine Swizzle auf, sodass kein Problem auftritt). Dadurch können die gleichen benutzerdefinierten Konstanten verwendet werden, unabhängig davon, wo Sincos verwendet wird.
Zielregisterregeln:
dest.x = cos(src1.selected_channel), dest.y = sin(src1.selected_channel), dest.z ist nach der Anweisung undefiniert.
dest sollte nicht dasselbe Register wie src1 sein.
Nur X und Y dürfen sich in der Zielschreibmaske befinden.
Die SINCOS-Anweisung ist eine Makroanweisung, die acht Anweisungsslots benötigt.
Nur X und Y dürfen sich in der Zielschreibmaske befinden.
Der maximale absolute Fehler ist 0,002.
Vorgang
Im Folgenden wird die Taylor-Serie für sin(x) und cos(x) gezeigt:
(1) cos(x) = 1 - x2/2! + x4/4! - x6/6! sin(x) = x - x3/3! + x5/5! - x7/7! = x*(1 - x2/3! + x4/5! - x6/7!)
Um die Genauigkeit zu erhöhen, berechnen wir cos(x) mithilfe von cos(x/2):
(2) cos(x) = 1 - 2*sin(x/2)*sin(x/2) sin(x) = 2*sin(x/2)*cos(x/2)
(1) kann durch Ersetzen von x durch x/2 wie folgt umgeschrieben werden:
(3) cos(x) = 1 - x2/(2!*4) + x4/(4!*16) - x6/(6!*64) sin(x) = x/2 - x3/(3!*8) + x5/(5!*32) - x7/(7!*128) = = x*(0.5f - x2/(3!*8) + x4/(5!*32) - x6/(7!*128))
Lets, schreiben (3) in Vektorform. Hier sind a,b,c,d 2D-Konstantenvektoren:
a + x2*b + x4*c + x6*d = a+x2*(b + x2*(c + x2*d)
Im Folgenden wird die Implementierung für SINCOS veranschaulicht:
SRC2 sollte konstant sein:
(1.f/(7!*128), 1.f/(6!*64), 1.f/(4!*16), 1.f/(5!*32) )
SRC3 sollte konstant sein:
(1.f/(3!*8), 1.f/(2!*8), 1.f, 0.5f )
VECTOR v1 = EvalSource(SRC1);
VECTOR v2 = EvalSource(SRC2);
VECTOR v3 = EvalSource(SRC3);
VECTOR v;
MUL v.z, v1.w, v1.w ; x*x
MAD v.xy, v.z, v2.xy, v2.wz
MAD v.xy, v.xy, v.z, v3.xy
MAD v.xy, v.xy, v.z, v3.wz ;
Partielle Sin(x/2) und end cos(x/2):
MUL v.x, v.x, v1.w ; sin(x/2)
MUL v.xy, v.xy, v.x ; compute sin(x/2)*sin(x/2) and sin(x/2)*cos(x/2)
ADD v.xy, v.xy, v.xy ; 2*sin(x/2)*sin(x/2) and 2*sin(x/2)*cos(x/2)
ADD v.x, -v.x, v3.z ; cos(x) and sin(x)
WriteResult(v, DST);
Wenn eine Anwendung SINCOS für einen beliebigen Winkel berechnen muss, kann der Winkel mithilfe des folgenden Makros (r0.x enthält den ursprünglichen Winkel) dem Bereich -Pi...+Pi zugeordnet werden:
def c0, Pi, 0.5f, 2*Pi, 1/(2*Pi)
mad r0.x, r.x, c0.w, c0.y
frc r0.x, r0.x
mad r0.x, r0.x, c0.z, -c0.x
Anforderungen
Verfügbar in Windows Vista und höheren Versionen der Windows-Betriebssysteme.