次の方法で共有


sincos - vs

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

構文

vs_2_0 および vs_2_x

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

この場合

  • dst はデスティネーション レジスタです。これはテンポラリ レジスタ (r#) である必要があります。デスティネーション レジスタは、.x、.y、.xy のいずれかのマスクを 1 つだけ持っていなければなりません。
  • src0 は入力角度を指定するソース レジスタです。角度は [-pi, +pi] の範囲内にする必要があります。{x|y|z|w} は必須の複製スィズルです。
  • src1 および src2 はソース レジスタです。これらは、2 つの異なる浮動小数点型定数レジスタ (c#) を指定する必要があります。src1 および src2 の値は、それぞれ D3DSINCOSCONST1 および D3DSINCOSCONST2 マクロの値と等しくなる必要があります。

vs_3_0

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

この場合

  • dst はデスティネーション レジスタです。これはテンポラリ レジスタ (r#) である必要があります。デスティネーション レジスタは、.x、.y、.xy のいずれかのマスクを 1 つだけ持っていなければなりません。
  • src0 は入力角度を指定するソース レジスタです。角度は [-pi, +pi] の範囲内にする必要があります。{x|y|z|w} は必須の複製スィズルです。

解説 

頂点シェーダーのバージョン 1_1 2_0 2_x 2_sw 3_0 3_sw
sincos x x x x x

vs_2_0 および vs_2_x

vs_2_0 および vs_2_x の場合、sincos はプレディケーションで使用できますが、プレディケーション レジスタ (p0) のスィズルには、複製スィズル (.x | .y | .z | .w) しか使用できないという制限があります。

vs_2_0 および vs_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 
    

vs_3_0

vs_3_0 の場合、sincos をプレディケーションに使用する際の制限は一切ありません。「プレディケーション レジスタ」を参照してください。

vs_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