DirectX Graphics 프로그래밍 가이드 고정 기능 파이프라인 텍스처 압축 텍스처 리소스 알파 채널에 의한 텍스처 [목차열람] [주소복사] [슬롯비우기] |
Microsoft DirectX 9.0 |
보다 복잡한 투명도를 나타내는 텍스처 맵의 encode에는, 2 통과해 방법이 있다. 어느 쪽의 경우도, 투명도를 기술하는 블록이 기술 끝난 64 비트 블록보다 먼저 있다. 투명도는 1 픽셀 4 비트의 4 × 4 비트 맵 (명시적인 encode), 또는 그것 이하의 비트와 선형 보간의 어느 쪽인지여, 그 선형 보간은 색encode로 사용되는 것과 유사하다.
투명도 블록과 색블록의 배치는, 다음 표에 나타내는 대로이다.
워드 어드레스 | 64 비트 블록 |
---|---|
3:0 | 투명도 블록 |
7:4 | 기술 끝난 64 비트 블록 |
명시적인 텍스처 encode (DXT2 와 DXT3 포맷)에서는, 투명도를 기술하는 텍셀의 알파 성분은, 1 텍셀 4 비트의 4 × 4 비트 맵으로 encode 된다. 이러한 4 비트는, 디더 링이나, 알파 데이터의 최상정도 4 비트의 사용 등, 다양한 방법으로 달성할 수 있다. 다만, 어떠한 보간을 실시하지 않는 이상 생성 된 것이 그대로 사용된다.
다음 그림은 64 비트의 투명도 블록을 나타내고 있다.
다음의 표는, 알파 정보가 각 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) {
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 }
알파 블록의 메모리 레이아웃을 다음에 나타낸다.
바이트 | 알파 |
---|---|
0 | Alpha_0 |
1 | Alpha_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) {