알파 채널이 있는 질감(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) {
관련 항목