Freigeben über


SINCOS-Anweisungsformat

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.