다음을 통해 공유


알파 채널이 있는 질감(Direct3D 9)

더 복잡한 투명도를 나타내는 텍스처 맵을 인코딩하는 방법에는 두 가지가 있습니다. 각 경우에 투명도를 설명하는 블록은 이미 설명된 64비트 블록 앞에 섰습니다. 투명도는 픽셀당 4비트(명시적 인코딩)가 있는 4x4 비트맵으로 표현되거나 색 인코딩에 사용되는 것과 유사한 비트 및 선형 보간이 적습니다.

투명도 블록과 색 블록은 다음 표와 같이 정렬됩니다.

Word 주소 64비트 블록
3:0 투명도 블록
7:4 이전에 설명한 64비트 블록

 

명시적 텍스처 인코딩

명시적 텍스처 인코딩(DXT2 및 DXT3 형식)의 경우 투명도를 설명하는 텍셀의 알파 구성 요소는 텍셀당 4비트가 있는 4x4 비트맵으로 인코딩됩니다. 이러한 네 비트는 디더링과 같은 다양한 수단을 통해 또는 알파 데이터의 가장 중요한 4개의 비트를 사용하여 달성할 수 있습니다. 그러나 그들은 생성됩니다, 그들은 보간의 어떤 형태없이, 그대로 사용됩니다.

다음 다이어그램은 64비트 투명도 블록을 보여 줍니다.

64비트 투명도 블록다이어그램

메모

Direct3D의 압축 메서드는 가장 중요한 4개의 비트를 사용합니다.

 

다음 표에서는 각 16비트 단어에 대해 알파 정보가 메모리에 배치되는 방법을 보여 줍니다.

이 표에는 단어 0의 레이아웃이 포함되어 있습니다.

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

 

*최적 비트, 가장 중요한 비트(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 형식에서는 색이 알파로 미리 곱하지 않은 것으로 가정합니다. 대부분의 경우 텍스처가 사용될 때까지 데이터 검사만으로는 색 값이 알파로 곱해졌는지 확인하기에 충분하지 않기 때문에 이러한 두 가지 형식이 필요합니다. 이 정보는 런타임에 필요하기 때문에 두 개의 FOURCC 코드를 사용하여 이러한 사례를 구분합니다. 그러나 이러한 두 형식에 사용되는 데이터 및 보간 방법은 동일합니다.

DXT1에서 텍셀이 투명한지 여부를 확인하는 데 사용되는 색 비교는 이 형식에서 사용되지 않습니다. 색 비교가 없으면 색 데이터는 항상 4색 모드로 처리되는 것으로 간주됩니다. 즉, DXT1 코드 맨 위에 있는 if 문은 다음과 여야 합니다.

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

Three-Bit 선형 알파 보간

DXT4 및 DXT5 형식의 투명도 인코딩은 색에 사용되는 선형 인코딩과 유사한 개념을 기반으로 합니다. 8비트 알파 값 2개와 픽셀당 3비트가 있는 4x4 비트맵은 블록의 처음 8바이트에 저장됩니다. 대표 알파 값은 중간 알파 값을 보간하는 데 사용됩니다. 두 알파 값이 저장되는 방식으로 추가 정보를 사용할 수 있습니다. alpha_0 alpha_1보다 크면 보간을 통해 6개의 중간 알파 값이 생성됩니다. 그렇지 않으면 4개의 중간 알파 값이 지정된 알파 극단 간에 보간됩니다. 두 개의 추가 암시적 알파 값은 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
}

알파 블록의 메모리 레이아웃은 다음과 같습니다.

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

 

DXT4와 DXT5의 차이점은 DXT4 형식에서 색 데이터가 알파로 미리 곱한 것으로 간주된다는 점입니다. DXT5 형식에서는 색이 알파로 미리 곱하지 않은 것으로 간주됩니다. 대부분의 경우 텍스처가 사용될 때까지 데이터 검사만으로는 색 값이 알파로 곱해졌는지 확인하기에 충분하지 않기 때문에 이러한 두 가지 형식이 필요합니다. 이 정보는 런타임에 필요하기 때문에 두 개의 FOURCC 코드를 사용하여 이러한 사례를 구분합니다. 그러나 이러한 두 형식에 사용되는 데이터 및 보간 방법은 동일합니다.

DXT1에서 텍셀이 투명한지 여부를 확인하는 데 사용되는 색 비교는 이러한 형식과 함께 사용되지 않습니다. 색 비교가 없으면 색 데이터는 항상 4색 모드로 처리되는 것으로 간주됩니다. 즉, DXT1 코드의 맨 위에 있는 if 문은 다음이어야 합니다.

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

압축된 텍스처 리소스