하드웨어 텍스처 압축은 어떻게 작동합니까?


13

픽셀 배열에 비해 데이터를 압축한다는 것은 분명합니다.

그러나 일반적인 압축과 다른 점은 무엇입니까 (png, jpeg 등)?


JPEG 및 PNG와 같은 "정상 압축"이란 무엇입니까? DXT 및 ASTC와 같은 하드웨어 지원 형식과 차이점에 대해 질문하고 있습니까?
Nathan Reed

6
(마지막으로, 내가 조금 아는 주제!) PNG / JPEG와 다른 점은 랜덤 액세스입니다. Texel (XY)에 액세스하려는 경우 해당 텍셀을 생성하는 데 필요한 작은 데이터 공간을 빠르게 결정할 수 있습니다. JPG 또는 PNG는 모든 데이터를 압축 해제해야합니다! Wikipedia 기사 의 섹션 1과 2 는 좋은 요약입니다.
Simon F

SimonF가 쓴 것처럼. 이것은 매우 광범위한 질문이며, 어떤 유형에 관심이 있는지에 따라 답이 달라집니다. DXT와 같은 사양을 보셨습니까?
imallett

답변:


25

Simon의 의견에서 언급했듯이 하드웨어 텍스처 압축과 일반적으로 사용되는 다른 이미지 압축의 주요 차이점은 전자가 엔트로피 코딩을 사용하지 않는다는 것입니다. 엔트로피 코딩은 ZIP과 같은 컨테이너 형식, GIF, JPEG 및 PNG와 같은 많은 일반적인 이미지 형식 및 많은 일반적인 오디오에서 볼 수있는 것처럼 짧은 비트 열을 사용하여 소스 데이터에서 일반적으로 발생하거나 반복되는 패턴을 나타냅니다. 그리고 비디오 형식.

엔트로피 코딩은 모든 종류의 데이터를 압축하는 데 효과적이지만 본질적으로 가변 압축 비율을 생성합니다. 이미지의 일부 영역에는 세부 사항이 거의 없거나 (사용중인 코딩 모델에 의해 세부 사항이 잘 예측 됨) 비트가 거의 필요하지 않지만 다른 영역에는 인코딩에 더 많은 비트가 필요한 복잡한 세부 사항이있을 수 있습니다. 압축 된 데이터에서 주어진 픽셀을 찾을 수있는 위치를 계산할 수있는 직접적인 방법이 없기 때문에 랜덤 액세스를 구현하기가 어렵습니다 ( xy) 좌표. 또한 대부분의 엔트로피 코딩 방식은 상태 저장이므로 스트림의 임의 위치에서 단순히 디코딩을 시작할 수 없습니다. 올바른 상태를 구축하려면 처음부터 시작해야합니다. 그러나 셰이더는 언제든지 텍스처의 어느 위치에서나 샘플링 할 수 있으므로 텍스처 샘플링에는 임의 액세스가 필요합니다.

따라서 엔트로피 코딩 대신 하드웨어 압축은 고정 비율 블록 기반 방식을 사용합니다. 예를 들어, DXT / BCn 압축 에서, 텍스처는 4x4 픽셀 블록으로 분할되며, 각각은 64 또는 128 비트로 인코딩됩니다 (어떤 형식이 선택되는지에 따라 다름). ASTC 에서 다른 형식은 4x4 에서 12x12 까지의 블록 크기를 사용하며 모든 블록은 128 비트로 인코딩됩니다. 비트가 이미지 데이터를 나타내는 방법에 대한 세부 사항은 형식에 따라 다르며 동일한 이미지 내에서 블록마다 다를 수 있지만 비율이 고정되어 있기 때문에 하드웨어에서 메모리에서 블록을 찾을 수있는 위치를 쉽게 계산할 수 있습니다. 지정된 ( x , y ) 픽셀을 포함하고 각 블록은 자체 포함되므로 다른 블록과 독립적으로 디코딩 할 수 있습니다.

하드웨어 텍스처 압축에서의 또 다른 고려 사항은 디코딩이 하드웨어에서 효율적으로 구현 가능해야한다는 것이다. 이는 많은 수학 연산과 복잡한 데이터 흐름이 바람직하지 않다는 것을 의미합니다. 예를 들어, 블록 당 8 비트 정수 수학 연산을 수행하여 작은 조회 테이블을 채우고 픽셀 당 적절한 테이블 항목을 찾아 BCn 형식을 디코딩 할 수 있습니다. 이를 위해서는 매우 적은 면적의 온칩이 필요합니다. 이는 여러 블록을 병렬로 디코딩해야하므로 디코드 하드웨어의 여러 복사본이 필요하기 때문에 중요합니다.

대조적으로, JPEG와 같은 DCT 기반 형식은 블록 당 픽셀을 가로 질러 다양한 중간 값을 교환하고 브로드 캐스트하는 복잡한 데이터 흐름을 언급 할 필요없이 픽셀 당 적은 양의 수학을 필요로합니다. ( 이 기사 에서 DCT 디코딩에 대한 자세한 내용은 이 기사참조하십시오 .) 이것은 하드웨어 구현에있어 훨씬 더 거칠 것입니다. GPU 하드웨어가 DCT 기반 또는 웨이블릿 기반 텍스처 압축을 구현하지 않은 AFAICT 인 이유입니다. .


훌륭한 답변. 또한 어떤 상황에서는 전용 하드웨어에 의존하지 않고 직접 압축하여 픽셀 쉐이더에서 클라이언트 코드로 디코딩 할 수 있다고 언급하는 논문이 있다고 덧붙일 수 있습니다. 나는 그것의 실제 사용이 없다는 것을 알고 있습니다. 그것은 연구에만 가치가있을 수 있지만 존재합니다.
v.oddou

1
@ Nathan-Reed re 변환 기반 압축, 실제로 Microsoft의 Talisman 프로젝트는 TREC라는 압축 구성표를 사용했습니다.이 모드 중 하나는 DCT를 사용했지만 JPEG와 달리 블록에 대한 임의 액세스를 허용했습니다 (테이블이 포함되어 있다고 생각합니다) 구애). 이것은 다양한 블록에 대해 가변 길이 데이터를 허용하지만 VQ TC가 유행을 벗어난 이유는 HW에 대한 간접 성이 불쾌합니다. FWIW 저는 약 12 ​​개의 TC 아이디어 B4 PVRTC를 실험했습니다. 일부는 고정 속도, 변환 기반이지만 "결측"계수는 여전히 비트를 사용합니다. BTC와 같은 고정 coeff 위치는 "무료"정보를 의미합니다.
Simon F

2
@ Nathan-Reed. 내가 본 것부터 모든 HW 디코더는 순수한 논리 경로 (비트 디코드, 일부 조회, 데이터 경로의 일부 수학)로 구현할 수 있지만 루프 / 레지스터가 필요하지 않습니다. 텍스처 조회에 사이클 대기 시간을 추가하는 구성표를 알고 있습니까? (나는 재미있게 VHDL ETC1 디코더를 구현했다.) 나는 각 텍스쳐 유닛 (TU)에 디코더가 내장되어 있다는 인상을 받았다.
Romain Piquois

31

"(하드웨어) 텍스처 압축 작동 방식" 은 큰 주제입니다. 희망적으로 나는 Nathan의 답변 내용을 복제하지 않고 통찰력을 제공 할 수 있기를 바랍니다 .

요구 사항

텍스쳐 압축은 일반적으로 Beers et al.의 Rendering from Compressed Textures에 요약 된 것처럼 네 가지 주요 방식으로 JPEG / PNG와 같은 '표준'이미지 압축 기술과 다릅니다 .

  1. Decoding Speed : 압축되지 않은 텍스처를 사용하는 것보다 텍스처 압축을 느리게하고 싶지 않습니다. 또한 하드웨어 및 전력 비용이 많이 들지 않으면 서 빠른 압축 풀기를 달성 할 수 있으므로 압축 풀기가 비교적 간단해야합니다.

  2. 랜덤 액세스 : 주어진 렌더 중에 어떤 텍셀이 필요할지 쉽게 예측할 수 없습니다. 액세스 된 텍셀의 일부 서브 세트 M 이 이미지 중간에서 나온 경우 M 을 결정하기 위해 텍스처의 모든 '이전'라인을 디코딩 할 필요는 없습니다 . JPEG 및 PNG를 사용하면 픽셀 디코딩이 이전에 디코딩 된 데이터에 의존하므로 필요합니다.
    "무작위"액세스 권한이 있다고해서이를 임의로 샘플링했다고해서 반드시 그렇지는 않습니다.

  3. 압축률과 시각적 품질 : Beers는 압축률을 높이기 위해 압축 된 결과물에서 일부 품질을 잃는 것이 가치있는 트레이드 오프라고 주장합니다. 3D 렌더링에서는 데이터가 조작 될 수 있으며 (예 : 필터링 및 음영 처리 등) 일부 품질 손실이 가려 질 수 있습니다.

  4. 비대칭 인코딩 / 디코딩 : 아마도 약간 더 논쟁의 여지가 있지만, 인코딩 프로세스가 디코딩보다 훨씬 느리게 진행될 수 있다고 주장합니다. 디코딩이 HW 충전 속도에 있어야한다고 가정하면, 이것은 일반적으로 허용됩니다. (PVRTC, ETC2 및 기타 일부를 최대 품질로 압축하는 것이 더 빠를 수 있음을 인정합니다)

초기 역사 및 기법

텍스처 압축이 30 년 이상 지속되었다는 사실을 알고 놀랄 수도 있습니다. 70 년대와 80 년대의 비행 시뮬레이터는 비교적 많은 양의 텍스처 데이터에 액세스 할 필요 가 있었으며 1980 년에 1MB의 RAM이 6000 달러 이상인 경우 텍스처 풋 프린트를 줄이는 것이 필수적이었습니다. 다른 예로서, 70 년대 중반, 소량의 고속 메모리 및 로직 (예 : 적당한 512x512 RGB 프레임 버퍼에 충분한)조차도 작은 집의 가격을 되돌릴 수 있습니다.

텍스쳐 압축으로 명시 적으로 언급되지는 않지만 AFAIK는 문헌 및 특허에서 다음을 포함한 기술에 대한 참조를 찾을 수 있습니다
. 간단한 형태의 수학적 / 절차 적 텍스쳐 합성
b. 단일 채널 텍스처 (예를 들어 4bpp)를 사용한 다음 텍스처 당 RGB 값을 곱한 값
c. YUV, 및
d. 팔레트 ( 압축을 수행하기 위해 Heckbert의 접근 방식 을 제안하는 문헌 )

이미지 데이터 모델링

위에서 언급 한 바와 같이, 텍스처 압축은 거의 항상 손실이 발생하므로 덜 중요한 정보를 폐기하면서 중요한 데이터를 간단한 방식으로 표현하려고하는 문제가된다. 아래에 설명 될 다양한 체계는 모두 텍스처 데이터와 눈의 반응에 대한 전형적인 행동과 유사한 암시적인 '매개 변수화 된'모델을 가지고 있습니다.

또한, 텍스처 압축은 고정 속도 인코딩을 사용하는 경향이 있기 때문에, 압축 프로세스는 일반적으로 모델에 공급 될 때 원래 텍스처의 양호한 근사를 생성 할 파라미터 세트를 찾기위한 검색 단계를 포함한다. 그러나이 검색 단계는 시간이 오래 걸릴 수 있습니다.
( optipng 와 같은 도구를 제외하고는 PNG 및 JPEG의 일반적인 사용이 텍스처 압축 체계와 다른 영역입니다)

계속 진행하기 전에 TC에 대한 추가 이해를 돕기 위해 데이터 압축에 매우 유용한 수학적 도구 인 PCA (Principal Component Analysis)를 살펴볼 가치가 있습니다.

텍스처 예

다양한 방법을 비교하기 위해 다음 이미지를 사용합니다.

작은 진 훙 잉 꼬 + 텍스트
이것은 RGB 색상 큐브의 많은 부분에 걸쳐 있고 텍셀의 15 %만이 반복 된 색상을 사용하기 때문에 특히 팔레트 및 VQTC 방법에 대해 상당히 힘든 이미지입니다.

PC 및 (90 년대 중반) 콘솔 텍스처 압축

데이터 비용을 줄이기 위해 일부 PC 게임 및 초기 게임 콘솔은 VQ (Vector Quantisation) 형태의 팔레트 이미지도 사용했습니다. 팔레트 기반 접근 방식은 주어진 이미지가 RGB (A) 컬러 큐브의 상대적으로 작은 부분 만 사용한다고 가정합니다. 팔레트 텍스처의 문제점은 달성 된 품질에 대한 압축률이 일반적으로 다소 낮다는 것입니다. "GIMP를 사용하여" "4bpp"로 압축 된 텍스처 예제 는 다시 VQ 스킴에 대해 비교적 거친 이미지라는 점에 주목하십시오.
여기에 이미지 설명을 입력하십시오

벡터가 더 큰 VQ (예 : 2bpp ARGB)

Beers 등에서 영감을 얻은 Dreamcast 콘솔은 VQ를 사용하여 2x2 또는 2x4 픽셀 블록을 단일 바이트로 인코딩했습니다. 팔레트 텍스처의 "벡터"는 3 차원 또는 4 차원이지만, 2x2 픽셀 블록은 16 차원 인 것으로 간주 될 수 있습니다. 압축 방식은 이러한 벡터의 대략적인 반복이 충분하다고 가정합니다.

VQ가 ~ 2bpp로 만족스러운 품질을 달성 할 수 있지만 이러한 체계의 문제점은 종속 메모리 읽기가 필요하다는 것입니다. 인덱스 맵에서 픽셀 코드를 결정하기위한 초기 읽기와 관련 픽셀 데이터를 실제로 가져 오는 데 1 초가 걸립니다. 그 코드로. 캐시를 추가하면 발생하는 일부 대기 시간을 줄일 수 있지만 하드웨어가 복잡해집니다.

2bpp Dreamcast 구성표로 압축 된 이미지 예는 2bpp VQ 결과입니다. 인덱스 맵은 다음과 같습니다.2bpp VQ 지수 맵

VQ 데이터의 압축은 다양한 방식으로 수행 될 수 있지만, IIRC 는 PCA를 사용하여 위의 벡터를 유도하고 주 벡터를 따라 16D 벡터를 2 세트로 분할하여 두 개의 대표 벡터가 평균 제곱 오차를 최소화하도록했다. 이어서, 256 개의 후보 벡터가 생성 될 때까지 과정을 반복 하였다. 대표성을 향상시키기 위해 글로벌 k-means / Lloyd의 알고리즘 접근법이 적용되었습니다.

색 공간 변환

색상 공간 변환은 또한 PCA를 사용합니다. 색상의 전체 분포는 종종 다른 축을 따라 덜 확산 된 채 주요 축을 따라 확산됩니다. YUV 표현의 경우, a) 장축이 종종 루마 방향이고 b)이 방향의 변화에 ​​눈이 더 민감하다고 가정합니다.

3dfx Voodoo 시스템은 각 8 비트 텍셀을 322 형식으로 분할하고 사용자가 선택한 색 변환을 해당 데이터에 적용하여 RGB로 매핑하는 8bpp, "좁은 채널"압축 시스템 인 "YAB"를 제공 했습니다. 따라서 주축은 8 개 레벨과 더 작은 축 (각각 4 개)을 가졌습니다.

S3 Virge 칩은 사용자가 전체 텍스처 에 대해 4bpp 단색 텍스처와 함께 주축에 두 개의 엔드 컬러 를 지정할 수있는 약간 더 간단한 4bpp 체계를 가졌습니다. 그런 다음 픽셀 당 값은 최종 색상을 적절한 가중치와 혼합하여 RGB 결과를 생성합니다.

BTC 기반 계획

몇 년 후, Delp와 Mitchell은 Block Truncation Coding (BTC) 이라는 간단한 (흑백) 이미지 압축 체계를 설계했습니다 . 이 백서에는 압축 알고리즘도 포함되어 있지만 우리는 압축 데이터와 압축 해제 프로세스에 주로 관심이 있습니다.

이 방식에서, 이미지는 전형적으로 4x4 픽셀 블록으로 분할되며, 이는 사실상 로컬 화 된 VQ 알고리즘으로 독립적으로 압축 될 수있다. 각 블록은 두 개의 "값", ab 및 4x4 인덱스 비트 세트로 표시되며, 각 비트에 사용할 두 값 중 어느 것을 식별합니다.

S3TC : 4bpp RGB (+ 1 비트 알파)
여러 색상 변형 이미지 압축을 위해 BTC의 것은 우리에게 관심의 제안되었지만 Iourcha 등의 S3TC 의 다소 잊혀진 작품의 재발견 것으로 보인다 일부, Hoffert 등 이 Apple의 Quicktime에서 사용되었습니다.

DirectX 변형이없는 원래 S3TC는 RGB 또는 RGB + 1 비트 알파 블록을 4bpp로 압축합니다. 텍스처의 각 4x4 블록은 두 가지 최종 색상 AB 로 대체되며 , 최대 2 개의 다른 색상은 고정 가중치 선형 블렌드로 파생됩니다. 또한, 블록의 각 텍셀에는이 4 가지 색상 중 하나를 선택하는 방법을 결정하는 2 비트 인덱스가 있습니다.

예를 들어 다음은 AMD / ATI Compressenator 도구로 압축 된 테스트 이미지의 4x4 픽셀 섹션입니다. ( 기술적으로 512x512 버전의 테스트 이미지에서 가져 왔지만 예제를 업데이트 할 시간이 부족하다는 것을 용서하십시오 ). 압축 과정을 보여줍니다. 색상의 평균 및 주축이 계산됩니다. 그런 다음 축에 '두 어져있는'두 개의 끝점을 찾기 위해 가장 적합한 방법이 수행됩니다. 두 개의 파생 된 1 : 2 및 2 : 1 블렌드 (또는 경우에 따라 50:50 블렌드)와 함께 오류를 최소화합니다. 그런 다음 각 원본 픽셀을 해당 색상 중 하나에 매핑하여 결과를 만듭니다.
여기에 이미지 설명을 입력하십시오

이 경우와 같이 주축에 의해 색상이 대략적으로 합리적이면 오차가 상대적으로 낮습니다. 그러나 아래에 표시된 인접 4x4 블록과 같이 색상이 더 다양하면 오류가 더 커집니다.
여기에 이미지 설명을 입력하십시오

AMD Compressonator로 압축 된 예제 이미지 는 다음을 생성합니다.
여기에 이미지 설명을 입력하십시오

색상은 블록마다 독립적으로 결정되므로 블록 경계에서 불연속성이있을 수 있지만 해상도가 충분히 높게 유지되는 한 이러한 블록 아티팩트는 눈에 띄지 않을 수 있습니다.
여기에 이미지 설명을 입력하십시오

ETC1 : 4bpp RGB
Ericsson Texture Compression은 4x4 블록의 텍셀에서도 작동하지만 YUV와 마찬가지로 로컬 텍셀 세트의 주축은 종종 "루마"와 매우 밀접한 상관 관계가 있다고 가정합니다. 그런 다음 텍셀 세트는 평균 색상과 해당 추정 축에 텍셀을 투영하는 매우 정량화 된 스칼라 '길이'로 나타낼 수 있습니다.

이것은 S3TC에 비해 데이터 저장 비용을 감소시키기 때문에, ETC는 분할 방식을 도입 할 수있게하여, 4x4 블록이 수평 4x2 또는 수직 2x4 서브 블록의 쌍으로 세분된다. 이들은 각각 평균 ​​색상이 있습니다. 이미지 예는 다음과 같습니다 . 부리 주변의 영역은 4x4 블록의 가로 및 세로 분할도 보여줍니다.
여기에 이미지 설명을 입력하십시오
여기에 이미지 설명을 입력하십시오

글로벌 + 로컬

Ivanov와 Kuzmin 의 분산 팔레트 또는 PVRTC 방법 같은 전역 및 로컬 구성표 사이에 교차하는 텍스처 압축 시스템이 있습니다 .

PVRTC : 4 & 2 bpp RGBA
PVRTC는 (실제로, 쌍 선형으로) 업 스케일 된 이미지가 전체 해상도 대상에 대한 근사치이고 근사치와 대상 사이의 차이, 즉 델타 이미지가 국소 적으로 단색이라고 가정합니다. 주축이 지배적입니다. 또한, 로컬 주축이 이미지를 가로 질러 보간 될 수 있다고 가정합니다.

(해야 할 일 : 고장을 보여주는 이미지 추가)

PVRTC1 4bpp로 압축 된 텍스처 예는 다음 과 같이 생성합니다. 부리 주변의 면적 : BTC- 스킴과 비교하여 블록 아티팩트는 일반적으로 제거되지만 소스 이미지에 강한 불연속성이있는 경우 (예 : 진 훙 잉 꼬의 머리의 실루엣.
여기에 이미지 설명을 입력하십시오

여기에 이미지 설명을 입력하십시오

2bpp 변형은 자연적으로 4bpp보다 오류가 높지만 (목 근처의 파란색 고주파 영역 주변의 정밀도 손실에 주목) 여전히 논란의 여지가없는 품질입니다.
여기에 이미지 설명을 입력하십시오

감압 비용에 대한 메모

전술 한 방식에 대한 압축 알고리즘은 평가 비용이 보통 내지 높지만, 특히 하드웨어 구현을위한 압축 해제 알고리즘은 비교적 저렴하다. 예를 들어, ETC1은 몇 개의 MUX와 정밀도가 낮은 가산기를 거의 요구하지 않습니다. 블렌딩을 수행하기 위해 S3TC가 약간 더 많은 추가 유닛; 그리고 PVRTC, 조금 더. 이론적으로 이러한 간단한 TC 체계를 통해 GPU 아키텍처는 필터링 단계 직전까지 압축 해제를 피할 수 있으므로 내부 캐시의 효과를 극대화 할 수 있습니다.

다른 계획

언급해야 할 다른 일반적인 TC 모드는 다음과 같습니다.

  • ETC2- '루마'와 잘 맞지 않는 색상 분포를 가진 영역의 처리를 향상시키는 ETC1의 (4bpp) 수퍼 세트입니다. 1 비트 알파를 지원하는 4bpp 변형과 RGBA 용 8bpp 형식도 있습니다.

  • ATC- S3TC 의 작은 변형입니다 .

  • FXT1 (3dfx)은 S3TC 테마의 보다 야심 찬 변형이었습니다 .

  • BC6 & BC7 : ARGB를 지원하는 8bpp, 블록 기반 시스템. HDR 모드 외에도 ETC보다 복잡한 파티셔닝 시스템을 사용하여 이미지 색상 분포를 더 잘 모델링합니다.

  • PVRTC2 : 2 & 4bpp ARGB. 이것은 이미지에서 강한 경계를 가진 한계를 극복하기위한 하나의 모드를 포함합니다.

  • ASTC : 이것은 블록 기반 시스템이지만 광범위한 bpp를 대상으로 가능한 많은 블록 크기를 가지고 있다는 점에서 다소 복잡합니다. 또한 의사 랜덤 파티션 생성기가있는 최대 4 개의 파티션 영역, 인덱스 데이터 및 / 또는 색상 정밀도 및 색상 모델에 대한 가변 해상도와 같은 기능이 포함되어 있습니다.


1
와우,이 블로그 어딘가에 있어야합니다! 좋은 대답입니다!
glampert

2
도움이되어 다행입니다. 블로그에 관해서 는 10 년 전에이 글을 썼지 만 실제로 할 시간이 없습니다.
Simon F

1
이전 블로그를 호스팅하는 웹 사이트가 죽었습니다. 이 최신 보관 된 버전입니다 : web.archive.org/web/20160322090245/http://web.onetel.net.uk/...
ahcox
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.