다음을 통해 공유


cnd - ps

src0 > 0.5 비교에 따라 src1과 src2 중에서 조건부로 선택합니다.

Syntax

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 셰이더에서 수행된 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라는 두 값을 비교하며 A가 v0에 로드되고 B가 v1에 로드된다고 가정합니다. A와 B는 모두 -1~+1 범위에 있어야 하고 색 레지스터(vₙ)가 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

픽셀 셰이더 명령