DirectX Graphics 프로그래밍 가이드 고정 기능 파이프라인 텍스처 압축 텍스처 리소스 알파 채널에 의한 텍스처   [목차열람] [주소복사] [슬롯비우기]
알파 채널에 의한 텍스처
 
Microsoft DirectX 9.0

알파 채널에 의한 텍스처


보다 복잡한 투명도를 나타내는 텍스처 맵의 encode에는, 2 통과해 방법이 있다. 어느 쪽의 경우도, 투명도를 기술하는 블록이 기술 끝난 64 비트 블록보다 먼저 있다. 투명도는 1 픽셀 4 비트의 4 × 4 비트 맵 (명시적인 encode), 또는 그것 이하의 비트와 선형 보간의 어느 쪽인지여, 그 선형 보간은 색encode로 사용되는 것과 유사하다.

투명도 블록과 색블록의 배치는, 다음 표에 나타내는 대로이다.

워드 어드레스64 비트 블록
3:0투명도 블록
7:4기술 끝난 64 비트 블록

명시적인 텍스처 encode

명시적인 텍스처 encode (DXT2 와 DXT3 포맷)에서는, 투명도를 기술하는 텍셀의 알파 성분은, 1 텍셀 4 비트의 4 × 4 비트 맵으로 encode 된다. 이러한 4 비트는, 디더 링이나, 알파 데이터의 최상정도 4 비트의 사용 등, 다양한 방법으로 달성할 수 있다. 다만, 어떠한 보간을 실시하지 않는 이상 생성 된 것이 그대로 사용된다.

다음 그림은 64 비트의 투명도 블록을 나타내고 있다.

64 비트 투명도 블록

  Microsoft® Direct3D® 의 압축 방법에서는, 최상정도 4 비트를 사용한다.

다음의 표는, 알파 정보가 각 16 비트 워드에 대해서 배치되는 방법에 대해 가리키고 있다.

워드 0 용의 배치는, 다음과 같다.

비트알파
3:0 (LSB*)[0][0]
7:4[0][1]
11:8[0][2]
15:12 (MSB*)[0][3]

*최하정도 비트 (LSB), 최상정도 비트 (MSB)

워드 1 용의 배치는, 다음과 같다.

비트알파
3:0 (LSB)[1][0]
7:4[1][1]
11:8[1][2]
15:12 (MSB)[1][3]

워드 2 용의 배치는, 다음과 같다.

비트알파
3:0 (LSB)[2][0]
7:4[2][1]
11:8[2][2]
15:12 (MSB)[2][3]

워드 3 용의 배치는, 다음과 같다.

비트알파
3:0 (LSB)[3][0]
7:4[3][1]
11:8[3][2]
15:12 (MSB)[3][3]

DXT2 와 DXT3 의 차이는, DXT2 포맷에서는, 컬러 데이터가 미리 알파를 곱셈이 끝난 상태인 것을 전제로 하고 있는 점이다. DXT3 포맷에서는, 컬러 데이터가 미리 알파를 곱셈이 끝난 상태가 아닌 것을 전제로 하고 있다. 이러한 2 개의 포맷이 필요한 것은, 대부분의 경우, 텍스처를 사용할 때까지는, 데이터를 조사하는 것 만으로는 색값이 알파를 곱셈이 끝난 상태일지 어떨지를 판단할 수 없기 때문에이다. 이러한 정보가 실행시에 필요해서, 2 개의 4 문자 코드 (FOURCC) 코드를 사용해 이러한 경우를 구별하고 있다. 다만, 이러한 2 개의 포맷에 사용되는 데이터와 보간의 메서드는 같다.

텍셀이 투과형인지 아닌지를 판정하기 위해서 DXT1 로 사용되는 색비교는, 이 포맷에서는 사용되지 않는다. 색비교없이는, 컬러 데이터는 항상 4 색모드로서 처리되는 것을 전제로 하고 있다. 즉, DXT1 코드의 선두의 if 문은 다음과 같이 된다.

if ((color_0 > color_1) OR ! DXT1) {

3 비트 선형 알파 보간

DXT4 및 DXT5 포맷에 대한 투명도의 부호는, 색에 사용되는 선형 부호 와 유사한 개념이 기가 된다. 2 개의 8 비트 알파값과 1 픽셀 3 비트의 4 × 4 비트 맵이, 블록의 최초의 8 바이트에 저장 된다. 전형적인 알파값은, 중간 알파값을 보간 하기 위해서 사용된다. 추가 정보는, 2 개의 알파값을 저장 하는 방법으로 이용할 수 있다. alpha_0 가 alpha_0 보다 큰 경우, 6 개의 중간 알파값이 보간에 의해 생성 된다. 또, 4 개의 중간 알파값이 지정되는 알파 극값간에 보간 된다. 2 개의 추가의 명시적인 알파값은, 0 (완전하게 투과형)으로 255 (완전하게 불투명)가 된다.

다음 샘플 코드는, 이 알고리즘을 나타내고 있다.

// 8-alpha or 6-alpha block?     
if (alpha_0 > alpha_1) {    
    // 8-alpha block:derive the other six alphas.     
    // Bit code 000 = alpha_0, 001 = alpha_1, others are interpolated.
    alpha_2 = (6 * alpha_0 + 1 * alpha_1 + 3) / 7;    // bit code 010
    alpha_3 = (5 * alpha_0 + 2 * alpha_1 + 3) / 7;    // bit code 011
    alpha_4 = (4 * alpha_0 + 3 * alpha_1 + 3) / 7;    // bit code 100
    alpha_5 = (3 * alpha_0 + 4 * alpha_1 + 3) / 7;    // bit code 101
    alpha_6 = (2 * alpha_0 + 5 * alpha_1 + 3) / 7;    // bit code 110
    alpha_7 = (1 * alpha_0 + 6 * alpha_1 + 3) / 7;    // bit code 111  
}    
else {  
    // 6-alpha block.     
    // Bit code 000 = alpha_0, 001 = alpha_1, others are interpolated.
    alpha_2 = (4 * alpha_0 + 1 * alpha_1 + 2) / 5;    // Bit code 010
    alpha_3 = (3 * alpha_0 + 2 * alpha_1 + 2) / 5;    // Bit code 011
    alpha_4 = (2 * alpha_0 + 3 * alpha_1 + 2) / 5;    // Bit code 100
    alpha_5 = (1 * alpha_0 + 4 * alpha_1 + 2) / 5;    // Bit code 101
    alpha_6 = 0;                                      // Bit code 110
    alpha_7 = 255;                                    // Bit code 111
}

알파 블록의 메모리 레이아웃을 다음에 나타낸다.

바이트알파
0Alpha_0
1Alpha_1
2[0][2] (2 LSBs), [0][1], [0][0]
3[1][1] (1 LSB), [1][0], [0][3], [0][2] (1 MSB)
4[1][3], [1][2], [1][1] (2 MSBs)
5[2][2] (2 LSBs), [2][1], [2][0]
6[3][1] (1 LSB), [3][0], [2][3], [2][2] (1 MSB)
7[3][3], [3][2], [3][1] (2 MSBs)

DXT4 와 DXT5 의 차이는, DXT4 포맷에서는, 컬러 데이터가 미리 알파를 곱셈이 끝난 상태인 것을 전제로 하고 있는 점이다. DXT5 포맷에서는, 컬러 데이터가 미리 알파를 곱셈이 끝난 상태가 아닌 것을 전제로 하고 있다. 이러한 2 개의 포맷이 필요한 것은, 대부분의 경우, 텍스처를 사용할 때까지는, 데이터를 조사하는 것 만으로는 색값이 알파를 곱셈이 끝난 상태일지 어떨지를 판단할 수 없기 때문에이다. 이러한 정보가 실행시에 필요해서, 2 개의 FOURCC 코드를 사용해 이러한 경우를 구별하고 있다. 다만, 이러한 2 개의 포맷에 사용되는 데이터와 보간의 메서드는 같다.

텍셀이 투과형인지 아닌지를 판정하기 위해서 DXT1 로 사용되는 색비교는, 이러한 포맷에서는 사용되지 않는다. 색비교없이는, 컬러 데이터는 항상 4 색모드로서 처리되는 것을 전제로 하고 있다. 즉, DXT1 코드의 선두의 if 문은 다음과 같이 된다.

if ((color_0 > color_1) OR ! DXT1) {


© 2002 Microsoft Corporation. All rights reserved.
↑TOP