본문 바로가기
자료는 자료지/외부에서 퍼온자료

ASTC_User_Guide 번역 3

by 대마왕J 2025. 12. 9.

5.5 퀸트(Quints)와 트리트(Trits)

5개의 심볼을 가진 알파벳(이를 퀸트, quint라고 함)을 3비트로 올림하여 처리하는 대신, 3개의 퀸트 문자를 함께 묶는 것이 더 효율적인 해결책입니다. 5개 심볼 알파벳의 3개 문자는 5^3 (125)가지의 조합을 가지며, 6.97비트의 정보를 담고 있습니다. 우리는 이 3개의 퀸트 문자를 7비트에 저장할 수 있으며, 이때 저장 공간 낭비는 0.5%에 불과합니다.

비슷한 방식으로 3개의 심볼을 가진 알파벳(이를 트리트, trit라고 함)을 구성하고, 트리트 문자를 5개씩 묶을 수 있습니다. 각 문자 그룹은 3^5 (243)가지의 조합을 가지며, 7.92비트의 정보를 담고 있습니다. 우리는 이 5개의 트리트 문자를 8비트에 저장할 수 있으며, 이때 저장 공간 낭비는 1%에 불과합니다.

비트 / 퀸트 / 트리트 ?
비트는 Binary Digit(이진 숫자)의 줄임말로 2를 의미. 일반적으로는 이게 맞죠. 
트리트는 Trinary(또는 Ternary) Digit(삼진 숫자)의 줄임말로 3을 의미. 즉 3진수를 쓴다는 말입니다.
Quinary Digit(오진 숫자)의 줄임말로 5를 의미하는 기술용어입니다. 즉 5진수를 쓴다는 말입니다.  

5.6 제한된 정수 시퀀스 인코딩 ( Bounded Integer Sequence Encoding : BISE)

ASTC가 사용하는 제한된 정수 시퀀스 인코딩(Bounded Integer Sequence Encoding, BISE)은 최대 256개의 심볼을 가진 임의의 알파벳(이전에도 말했지만 여기서 말하는 알파벳은 정말 알파벳이 아니라 데이터 저장 개수를 의미하는 말입니다 )  을 사용하는 문자 시퀀스를 저장할 수 있게 해줍니다. 각 알파벳 크기는 비트(bits), 트리트(trits), 퀸트(quints) 중 가장 공간 효율적인 조합으로 인코딩됩니다. (이 정보는 헤더에 적혀 있어서 이 정보가 있는 헤더를 가진 블럭은 모두 같은 방식으로 디코딩합니다. 애매하게 남는 공간을 여러 조합에 의해 꽉꽉 채워 쓰자라는게 목표입니다.)

  • 최대 (2^n - 1)개의 심볼을 가진 알파벳은 문자당 n비트를 사용하여 인코딩할 수 있습니다.
  • 최대 3 x (2^n - 1)개의 심볼을 가진 알파벳은 문자당 n비트(m)와 1개의 트리트(t)를 사용하여 인코딩할 수 있으며, ((t x 2^n) + m) 수식을 사용하여 재구성됩니다.
  • 최대 5 x (2^n - 1)개의 심볼을 가진 알파벳은 문자당 n비트(m)와 1개의 퀸트(q)를 사용하여 인코딩할 수 있으며, ((q x 2^n) + m) 수식을 사용하여 재구성됩니다.

시퀀스의 문자 수가 3이나 5의 배수가 아닐 때 시퀀스의 끝부분에서 저장 공간이 낭비되는 것을 피하기 위해, 인코딩에 또 다른 제약을 추가합니다. 인코딩할 시퀀스의 마지막 몇 개의 값이 0이라면, 인코딩된 비트 문자열의 마지막 몇 비트 또한 반드시 0이어야 합니다. 이상적으로는 0이 아닌 비트의 수를 쉽게 계산할 수 있어야 하며, 이전 인코딩 값들의 크기에 의존하지 않아야 합니다. 이는 압축 과정에서 배열하기 까다롭지만 가능은 합니다.

(인코딩 공식을 만들 때, '값 0'은 무조건 '비트 000...'으로 변환되도록 설계해야 한다라는 뜻으로... 이는 컴퓨터가 오해하지 않게 해 줍니다. 즉 미묘하고 애매하게 값이 남았을때 값 0을 넣으면 비트 000... 으로 변환되고, 이를 디코딩하는 GPU는 그냥 이후 데이터가 없다라고 인식해서 쓸데없는 공간을 더 배치 안하고 잘라버릴 수 있는 것입니다.
이런 경우 택배로 비유를 많이 하는데, 택배보낼때 박스 규격 넘는 애매한 녀석들은 새 박스에 넣고 빈 구석을 스티로폼 -패딩- 으로 채워야 하는데, 이걸 안하고 그냥 뚝 짤라버려 저장하는 것입니다. 이 규칙이죠.) 

이 제약이 있으면 비트 시퀀스가 끝난 후에 패딩(padding)을 저장할 필요가 없습니다. 남은 부분은 0 비트라고 안전하게 가정할 수 있기 때문입니다.

이러한 제약을 적용하고 비트, 트리트, 퀸트를 스마트하게 패킹함으로써, BISE는 N 심볼 알파벳의 S개 문자로 이루어진 문자열을 고정된 비트 수로 인코딩합니다.

  • S값이 최대 (2^N - 1)일 때: (N x S) 비트 사용.
  • S값이 최대 (3 * 2^N - 1)일 때: (N x S + ceil(8S / 5)) 비트 사용.
  • S값이 최대 (5 * 2^N - 1)일 때: (N x S + ceil(7S / 3)) 비트 사용.

압축기는 저장하려는 알파벳 크기에 대해 가장 적은 저장 공간을 생성하는 옵션을 선택합니다. 일부는 바이너리(2진수)를 사용하고, 일부는 비트와 트리트를, 일부는 비트와 퀸트를 사용합니다. 인코딩하고자 하는 가능한 알파벳 크기 범위에 대해 BISE의 저장 효율성을 단순 바이너리와 비교해보면, BISE가 훨씬 더 효율적임을 알 수 있습니다.

5.7 블록 크기 (Block sizes)

ASTC는 항상 텍셀(texel) 블록을 128비트 출력으로 압축합니다. 하지만 ASTC는 개발자가 이미지 품질과 용량 사이의 세밀한 트레이드오프를 가능하게 하도록 다양한 블록 크기를 선택할 수 있게 합니다.

아래 표는 다양한 블록 크기 결과와 그에 해당하는 텍셀당 비트 수(bits per texel)를 보여줍니다.

5.8 컬러 엔드포인트 (Color endpoints)

블록의 컬러 데이터는 두 컬러 엔드포인트 사이의 그라디언트로 인코딩됩니다. 각 텍셀은 그라디언트 상의 위치를 선택하며, 이는 압축 해제 시 보간(interpolated)됩니다. ASTC는 엔드포인트 모드라고 알려진 16가지의 컬러 엔드포인트 인코딩 방식을 지원합니다.

엔드포인트 모드 옵션을 통해 다음 항목들을 변경할 수 있습니다.

  • 컬러 채널의 수: 예) 휘도(luminance), 휘도+알파, rgb, 또는 rgba.
  • 인코딩 방식: 예) 직접(direct), 기본+오프셋(base+offset), 기본+스케일(base+scale), 또는 양자화 레벨(quantization level).
  • 데이터 범위: 예) LDR(Low Dynamic Range) 또는 HDR(High Dynamic Range).

엔드포인트 모드와 엔드포인트 컬러 BISE 양자화 레벨은 블록 단위로 선택할 수 있습니다.

5.9 컬러 파티션 (Color partitions)

블록 내의 색상은 복잡한 경우가 많습니다. 단일 색상 그라디언트로는 블록 내의 모든 색상을 정확하게 캡처하지 못하는 경우가 빈번합니다. 예를 들어, 앞서 설명한 초록색 잔디 위에 놓인 빨간 공 같은 경우 두 개의 컬러 파티션이 필요합니다.

ASTC는 하나의 블록이 파티션(partitions)이라 불리는 최대 4개의 컬러 그라디언트를 참조할 수 있게 합니다. 각 텍셀은 압축 해제 목적을 위해 하나의 파티션에 할당됩니다.

각 텍셀의 파티션 할당 정보를 직접 저장하는 것은 모든 블록 크기에 대해 저장하기에는 너무 많은 압축 해제 하드웨어를 필요로 합니다. 대신, ASTC는 파티션 인덱스를 시드(seed) 값으로 사용하여 다양한 패턴을 알고리즘적으로 생성합니다. 압축 과정에서 각 블록에 가장 잘 맞는 패턴을 선택합니다. 그러면 블록은 가장 잘 맞는 패턴의 인덱스만 저장하면 됩니다.

파티션의 수와 파티션 인덱스는 블록 단위로 선택할 수 있으며, 파티션별로 다른 컬러 엔드포인트 모드를 선택할 수도 있습니다.

ASTC는 10비트 시드를 사용하여 파티션 할당을 구동합니다. 사용되는 해시(hash)는 파티션의 1/3에는 수평 편향을, 1/3에는 수직 편향을, 마지막 1/3에는 편향 없음을 적용합니다. 절차적으로 생성되기 때문에 일부 파티션, 특히 작은 블록 크기에서는 유용하지 않을 수 있습니다.

많은 파티션이 중복되며, 다수는 퇴화(degenerate)된 상태입니다. N 파티션 해시는 텍셀을 하나도 포함하지 않는 파티션 할당을 최소 하나 이상 생성합니다.

5.10 각 블록에 최적의 패턴 선택하기

압축 중에 알고리즘은 올바른 분포 패턴과 경계 색상 쌍을 선택한 다음, 각 픽셀에 대한 양자화된 값을 생성해야 합니다. 패턴과 경계 색상을 선택하는 데에는 어느 정도의 시행착오가 수반됩니다. 압축 시에는 압축 시간과 최종 이미지 품질 사이에 트레이드오프가 존재합니다. 품질이 높을수록 알고리즘은 최적의 대안을 결정하기 전에 더 많은 대안을 시도합니다. 압축에 시간이 얼마나 걸리든 압축 해제 시간은 고정되어 있습니다. 이는 이미지 데이터가 단일 패스(pass) 내에서 패턴과 경계 색상으로부터 항상 다시 외삽(re-extrapolated)될 수 있기 때문입니다.

압축 알고리즘은 다양한 시도의 품질을 판단하기 위해 서로 다른 지표를 사용할 수 있습니다. 이러한 지표는 순수한 신호 대 잡음비(signal to noise) 값부터 인간의 시각적 예리함(visual acuity)에 가중치를 둔 지각적 판단까지 다양합니다. 알고리즘은 채널을 전체로서가 아니라 개별적으로 판단할 수도 있습니다. 채널을 개별적으로 다루는 것은 개별 채널이 쉐이더 프로그램의 데이터 소스로 사용될 수 있는 텍스처의 디테일을 보존하거나, 접선 공간(tangent space) 노멀 맵에서 중요한 각도 노이즈(angular noise)를 줄이는 데 유용합니다.

5.11 텍셀 가중치 (Texel weights)

각 텍셀은 가중치(weight)를 필요로 하며, 이는 컬러 그라디언트를 보간할 때 각 컬러 엔드포인트의 상대적 기여도를 정의합니다.

작은 블록 크기의 경우, 텍셀당 하나의 가중치를 두어 가중치를 직접 저장할 수 있습니다. 그러나 큰 블록 크기의 경우 이를 수행할 충분한 비트 저장 공간이 없습니다. 이 문제를 해결하기 위해 ASTC는 가중치 그리드(weight grid)를 텍셀 그리드보다 낮은 해상도로 저장할 수 있게 합니다. 텍셀별 가중치는 압축 해제 중에 저장된 가중치 그리드로부터 쌍선형 보간(bilinear interpolation)을 사용하여 보간됩니다.

텍셀 가중치의 수와 가중치 값 BISE 양자화 레벨 모두 블록 단위로 선택할 수 있습니다.

위의 내용을 쉽게 설명하자면,
- 여러 색상이 블랜딩되는 방법을 만들기 위해 위 패턴에서 일단 비슷한 패턴을 찾고,
- 칼라 엔드포인트라고 하는, 블럭의 각 구역이 무슨색인지 결정하고, 
- 이후에는 텍셀 가중치라고 하는 웨이트값을 넣어서 나의 최종 텍셀값을 결정한다는 말입니다.
 

5.12 듀얼 플레인 가중치 (Dual-plane weights)

모든 컬러 채널에 단일 가중치를 사용하는 것은 채널 간 상관관계가 높을 때는 잘 작동하지만, 항상 그런 것은 아닙니다. 상관관계가 낮은 일반적인 예는 다음과 같습니다.

  • RGBA 데이터를 저장하는 텍스처: 알파 마스크는 보통 컬러 값과 밀접한 상관관계가 없습니다.
  • 노멀(normal) 데이터를 저장하는 텍스처: X와 Y 노멀 값은 종종 독립적으로 변합니다.

ASTC는 각 텍셀에 대해 두 개의 별도 가중치 그리드를 사용하는 듀얼 플레인(dual-plane) 모드를 제공합니다. 단일 채널을 두 번째 가중치 플레인에 할당하고, 나머지 세 채널은 첫 번째 가중치 플레인을 사용할 수 있습니다.

듀얼 플레인 모드 사용 여부는 블록 단위로 선택할 수 있지만, 이를 사용하면 4개의 컬러 파티션을 사용할 수 없습니다. 이는 추가적인 가중치 플레인과 추가적인 컬러 엔드포인트 세트를 동시에 저장할 충분한 비트가 없기 때문입니다.

이것은 채널 침범에 대한 이야기입니다. RGBA 분리가 심할때 .. 예시는 위에 설명한대로 마스크맵이나 노멀맵일때죠. 
이럴때 거의 자동으로 알아서 듀얼 플레인 가중치를 사용한다는 말입니다. 
대신 이렇게 하면 컬러 파티션을 4개를 사용못해서 색상의 다양성이 떨어질 수 있지만, 마스크맵이나 노멀맵은 색상의 다양성보다는 침범 없는게 중요하니까 이쪽을 선택하는게 더 낫다라는 말이죠 

 

반응형

'자료는 자료지 > 외부에서 퍼온자료' 카테고리의 다른 글

ASTC_User_Guide 번역 5  (0) 2025.12.14
ASTC_User_Guide 번역 4  (0) 2025.12.14
[번역]양식화된 잔디 렌더링  (0) 2025.12.09
ASTC_User_Guide 번역 2  (0) 2025.12.05
ASTC_User_Guide 번역 1  (0) 2025.10.26

댓글