cnd - ps

比較 src0 0.5 > に基づいて、src1 と src2 を条件付きで選択します。

構文

cnd dst、src0、src1、src2

 

where

  • dst は宛先レジスタです。
  • src0 はソース レジスタです。
  • src1 はソース レジスタです。
  • src2 はソース レジスタです。

解説

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

 

バージョン 1_1 から 1_3 の場合、src0 は r0.a である必要があります。

// Version 1_1 to 1_3
if (r0.a > 0.5)
  dest = src1
else
  dest = src2

バージョン 1_4 では、各チャネルが個別に比較されます。

for each component in src0
{
   if (src0.component > 0.5)
     dest.component = src1.component
   else
     dest.component = src2.component
}

これらの例では、バージョン 1_4 シェーダーで行われた 4 チャネル比較と、バージョン 1_1 シェーダーで可能な単一チャネル比較を示します。

ps_1_4
def c0, -0.5, 0.5, 0, 0.6
def c1,  0,0,0,0
def c2,  1,1,1,1

cnd r1, c0, c1, c2   // r0 contains 1,1,1,0 because
// r1.x = c2.x because c0.x <= 0.5
// r1.y = c2.y because c0.y <= 0.5
// r1.z = c2.z because c0.z <= 0.5
// r1.w = c1.w because c0.w >  0.5

バージョン 1_1 から 1_3 は、r0 のレプリケートされたアルファ チャネルとのみ比較されます。

ps_1_1
def c0, -0.5, 0.5, 0, 0.6
def c1,  0,0,0,0
def c2,  1,1,1,1
mov r0, c0
cnd r1, r0.a, c1, c2   // r1 gets assigned 0,0,0,0 because 
                       // r0.a > 0.5, therefore r1.xyzw = c1.xyzw

この例では、A と B の 2 つの値を比較します。この例では、A が v0 に読み込まれ、B が v1 に読み込まれると想定しています。 A と B の両方が -1 ~ +1 の範囲である必要があります。カラー レジスタ (vn) は 0 から 1 の間に定義されているため、この例では制限が満たされます。

ps_1_1                // Version instruction
sub r0, v0, v1_bias   // r0 = A - (B - 0.5)
cnd r0, r0.a, c0, c1  // r0 = ( A > B ? c0 : c1 )

// r0 = c0 if A > B, otherwise, r0 = c1

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