Condividi tramite


Formato istruzione SINCOS

L'istruzione SINCOS calcola il sine e il cosno, nei radianti. Il componente X del risultato contiene cos(x); il componente Y contiene sin(x).

Formato

token di istruzione contenente D3DSIO_SINCOS. La lunghezza dell'istruzione è 4.

token di parametro di destinazione usando il tipo di registrazione D3DSPR_TEMP.

primo token di parametro di origine. Richiede l'uso esplicito del componente swizzle replicato, ovvero X, Y, Z o W swizzle (o R, G, B o A equivalente) deve essere specificato.

I token di origine seguenti sono per le versioni pixel e vertex shader precedenti a 3_0. Vale a dire, per pixel e vertex shader versione 3_0 e successiva, viene usato solo il primo token di parametro di origine.

secondo token di parametro di origine usando il tipo di registrazione D3DSPR_TEMP.

terzo token di parametro di origine usando il tipo di registrazione D3DSPR_TEMP.

Commenti

La seconda e la terza origine possono essere usate come registri temporanei.

Regole di registrazione di origine:

  • src1. selected_channel è un angolo misurato in radianti tra -Pi e +Pi.

  • 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).

    L'ordinamento degli ultimi due numeri in src2 e src3 è scelto specificamente per ospitare pixel shader 2.0, che ha anche la macro SINCOS. L'inversione di questi numeri significa che l'espansione della macro può usare uno dei pochi swizzles di origine personalizzati disponibili per ps_2_0 (i vertex shader hanno lo swizzle generale in modo che non vi sia alcun problema). Ciò consente di usare le stesse costanti personalizzate, indipendentemente dalla posizione in cui viene usato sincos.

Regole di registrazione destinazione:

  • dest.x = cos(src1.selected_channel), dest.y = sin(src1.selected_channel), dest.z non è definito dopo l'istruzione.

  • dest non deve essere lo stesso registro di src1.

  • Solo X e Y possono trovarsi nella maschera di scrittura di destinazione.

L'istruzione SINCOS è un'istruzione macro che accetta otto slot di istruzione.

Solo X e Y possono trovarsi nella maschera di scrittura di destinazione.

L'errore assoluto massimo è 0,002.

Operazione

Di seguito viene illustrata la serie Taylor per sin(x) e cos(x):

(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!)

Per aumentare la precisione calcolata cos(x) usando cos(x/2):

(2) cos(x) = 1 - 2*sin(x/2)*sin(x/2) sin(x) = 2*sin(x/2)*cos(x/2)

(1) può essere riscritta sostituendo x a x/2 come:

(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))

Consente di scrivere (3) in formato vettore. In questo caso, b,c,d sono vettori costanti 2D:

a + x2*b + x4*c + x6*d = a+x2*(b + x2*(c + x2*d)

Di seguito viene illustrata l'implementazione per SINCOS:

SRC2 deve essere costante:

(1.f/(7!*128), 1.f/(6!*64), 1.f/(4!*16), 1.f/(5!*32) )

SRC3 deve essere costante:

(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 ; 

Sin parziale(x/2) e cos finale(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);

Se un'applicazione deve calcolare SINCOS per un angolo arbitrario, l'angolo può essere mappato all'intervallo -Pi...+Pi usando la macro seguente (r0.x contiene l'angolo originale):

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

Requisiti

Disponibile in Windows Vista e versioni successive dei sistemi operativi Windows.