cnd - ps

根据比较 src0 0.5 > ,有条件地在 src1 和 src2 之间进行选择。

语法

cnd dst, src0, src1, src2

 

其中

  • 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 着色器中完成的四通道比较,以及在版本 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 仅与复制的 alpha 通道 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。该示例假定 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

像素着色器说明