次の方法で共有


sincos - ps

サインとコサインをラジアン単位で計算します。

構文

ps_2_0とps_2_x

sincos dst.{x|y|xy}, src0.{x|y|z|w}, src1, src2

 

この場合、

  • dst は宛先レジスタであり、 一時レジスタ (r#) である必要があります。 宛先レジスタには、.x | .y | .xy という 3 つのマスクのいずれかを指定する必要があります。
  • src0 は入力角度を提供するソース レジスタです。入力角度は [-pi, +pi] 内である必要があります。 {x|y|z|w} は、必要なレプリケート スウィズルです。
  • src1 と src2 はソース レジスタであり、2 つの異なる 定数浮動小数点レジスタ(c#) である必要があります。 src1 と src2 の値は、マクロ D3DSINCOSCONST1D3DSINCOSCONST2 の値である必要があります。

ps_3_0

sincos dst.{x|y|xy}, src0.{x|y|z|w}

 

この場合、

  • dst は宛先レジスタであり、 一時レジスタ (r#) である必要があります。 宛先レジスタには、.x | .y | .xy という 3 つのマスクのいずれかを指定する必要があります。
  • src0 は入力角度を提供するソース レジスタです。入力角度は [-pi, +pi] 内である必要があります。 {x|y|z|w} は、必要なレプリケート スウィズルです。

解説

ピクセル シェーダーのバージョン 1_1 1_2 1_3 1_4 2_0 2_x 2_sw 3_0 3_sw
sincos x x x x x

 

ps_2_0とps_2_x

ps_2_0とps_2_xの場合、sincos は事前指定と共に使用できますが、 述語レジスタ (p0) のスウィズルに対する 1 つの制限があります。レプリケートできるのは swizzle (.x | .y | .z | .w) のみです。

ps_2_0とps_2_xの場合、命令は次のように動作します (V = レプリケート スウィズルを含む src0 のスカラー値)。

  • 書き込みマスクが .x の場合:

    dest.x = cos(V)
    dest.y is undefined when the instruction completes
    dest.z is undefined when the instruction completes
    dest.w is not touched by the instruction
    
  • 書き込みマスクが .y の場合:

    dest.x is undefined when the instruction completes
    dest.y = sin(V)
    dest.z is undefined when the instruction completes
    dest.w is not touched by the instruction
    
  • 書き込みマスクが .xy の場合:

    dest.x = cos(V)
    dest.y = sin(V)
    dest.z is undefined when the instruction completes
    dest.w is not touched by the instruction
    

ps_3_0

ps_3_0の場合、sincosは何の制限もなく専念と共に使用することができます。 述語の登録に関するページを参照してください。

ps_3_0の場合、命令は次のように動作します (V = レプリケート スウィズルを含む src0 のスカラー値)。

  • 書き込みマスクが .x の場合:

    dest.x = cos(V)
    dest.y is not touched by the instruction
    dest.z is not touched by the instruction
    dest.w is not touched by the instruction
    
  • 書き込みマスクが .y の場合:

    dest.x is not touched by the instruction
    dest.y = sin(V)
    dest.z is not touched by the instruction
    dest.w is not touched by the instruction
    
  • 書き込みマスクが .xy の場合:

    dest.x = cos(V)
    dest.y = sin(V)
    dest.z is not touched by the instruction
    dest.w is not touched by the instruction
    

アプリケーションは、次のシェーダー擬似コードを使用して、任意の角度 (ラジアン単位) を範囲 [-pi, +pi] にマップできます。

def c0, pi, 0.5, 2*pi, 1/(2*pi)
mad r0.x, input_angle, c0.w, c0.y
frc r0.x, r0.x
mad r0.x, r0.x, c0.z, -c0.x

ピクセル シェーダーの手順