Compartir a través de


Formato de instrucción SINCOS

La instrucción SINCOS calcula el seno y el coseno, en radianes. El componente X del resultado contiene cos(x); el componente Y contiene sin(x).

Formato

token de instrucción que contiene D3DSIO_SINCOS. La longitud de la instrucción es 4.

token de parámetro de destino mediante el tipo de registro D3DSPR_TEMP.

primer token de parámetro de origen. Requiere el uso explícito de replicación de swizzle, es decir, se debe especificar el componente X, Y, Z o W swizzle (o R, G, B o A equivalente).

Los siguientes tokens de origen son para versiones de sombreador de píxeles y vértices anteriores a 3_0. Es decir, para la versión 3_0 del sombreador de píxeles y vértices, solo se usa el primer token de parámetro de origen.

segundo token de parámetro de origen mediante el tipo de registro D3DSPR_TEMP.

tercer token de parámetro de origen mediante el tipo de registro D3DSPR_TEMP.

Comentarios

Los orígenes segundo y tercero podrían usarse como registros temporales.

Reglas de registro de origen:

  • src1. selected_channel es un ángulo medido en radianes entre -Pi y +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).

    El orden de los dos últimos números en src2 y src3 se elige específicamente para dar cabida al sombreador de píxeles 2.0, que también tiene la macro SINCOS. Revertir estos números significa que la expansión de macros puede usar uno de los pocos swizzles de origen personalizados que está disponible para ps_2_0 (los sombreadores de vértices tienen un swizzle general, por lo que no hay ningún problema). Esto permite usar las mismas constantes personalizadas, independientemente de dónde se usen los sincos.

Reglas de registro de destino:

  • dest.x = cos(src1.selected_channel), dest.y = sin(src1.selected_channel), dest.z no está definido después de la instrucción.

  • dest no debe ser el mismo registro que src1.

  • Solo se permite que X e Y estén en la máscara de escritura de destino.

La instrucción SINCOS es una instrucción de macro que toma ocho ranuras de instrucción.

Solo se permite que X e Y estén en la máscara de escritura de destino.

El error absoluto máximo es 0,002.

Operación

A continuación se muestra la serie Taylor para sin(x) y 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!)

Para aumentar la precisión, calculamos cos(x) mediante cos(x/2):

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

(1) se puede volver a escribir sustituyendo x a x/2 como:

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

Permite, escribir (3) en forma vectorial. Aquí a,b,c,d son vectores de constante 2D:

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

A continuación se muestra la implementación de SINCOS:

SRC2 debe ser constante:

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

SRC3 debe ser constante:

(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 parcial(x/2) y cos final(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);

Si una aplicación debe calcular SINCOS para un ángulo arbitrario, el ángulo se puede asignar al intervalo -Pi...+Pi mediante la siguiente macro (r0.x contiene el ángulo original):

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

Requisitos

Disponible en Windows Vista y versiones posteriores de los sistemas operativos Windows.