Unity에서 GPU를 이용한 실시간 DXT/BCn 압축
요약
본 기사는 Unity의 컴퓨트 셰이더를 활용하여 GPU 상에서 실시간으로 DXT/BCn 같은 텍스처 압축을 수행하는 방법을 설명합니다. 임시 RenderTexture와 특수 `Graphics.CopyTexture` 기능을 조합하여 원본 텍스처를 원하는 압축 형식으로 변환하고, 그 결과를 화면에 표시하는 테스트베드를 제시합니다.
핵심 포인트
- Unity 컴퓨트 셰이더로 GPU 상에서 텍스처 압축 가능
- 임시 RenderTexture는 BCn 블록당 하나의 픽셀을 담음
- 일반적인 `Graphics.CopyTexture`로는 작동하지 않으며, `srcElement`/`dstElement`를 사용해야 함
- AMD Compressonator 및 Microsoft FastBlockCompress 등 외부 코드를 활용함
실시간 DXT/BCn 압축을 Unity에서 GPU로 수행하기
Unity에서 컴퓨트 셰이더(compute shader)를 사용하여 텍스처 압축을 GPU 상에서 수행하는 방법을 보여주는 작은 테스트베드입니다.

GPU 텍스처 압축 방법 개요:
- 입력은 GPU가 샘플링할 수 있는 모든 2D 텍스처(일반 텍스처, 렌더 텍스처 등)입니다.
- 목적지 텍스처보다 각 축마다 4배 작은 임시 RenderTexture가 필요하며, 즉 그 안의 "픽셀" 하나하나가 하나의 BCn 블록이 됩니다. 텍스처 형식은 DXT1/BC1의 경우
GraphicsFormat.R32G32_SInt(64비트)이며, 그렇지 않은 경우에는GraphicsFormat.R32G32B32A32_SInt(128비트)입니다. 컴퓨트 셰이더에서 쓰기 가능하도록enableRandomWrite=true로 설정해야 합니다. - 출력은 입력과 동일한 크기(4의 배수가 되도록 패딩 추가 가능)를 가지는 압축 형식 중 하나(DXT1/BC1, DXT5/BC3 등)를 사용한 Texture2D입니다. GPU에 존재하기만 하면 되므로, 시간을 절약하기 위해
TextureCreationFlags.DontInitializePixels | TextureCreationFlags.DontUploadUponCreate플래그로 Texture2D를 생성하고, 여기에Apply(false, true)를 호출합니다. 이때 마지막 인수는 CPU 측 메모리 복사를 생략하게 합니다. - 컴퓨트 셰이더는 단계 1의 입력 텍스처를 읽어와 {수행하려는 모든 GPU 텍스처 압축 작업}을 수행하고, 단계 2의 "BCn 블록당 하나의 픽셀" 임시 텍스처에 기록합니다.
- 이제 우리는 임시 "BCn 블록당 하나의 픽셀" 텍스처(단계 2)에서 실제 목적지 텍스처(단계 3)로 복사해야 합니다. 소스 및 목적지 텍스처만 사용하는
Graphics.CopyTexture또는CommandBuffer.CopyTexture는 작동하지 않습니다(왜냐하면 이 함수들은 "너비와 높이가 일치하는지"를 확인하는데, 실제로는 각 축마다 4배 차이가 나기 때문입니다). - 하지만,
srcElement와dstElement인수를 받는Graphics.CopyTexture(또는 CommandBuffer 등가물)는 (가장 큰 미프 레벨에 대해 0을 사용) 작동합니다! - 성공입니다! 📈
이 프로젝트에 포함된 내용:
프로젝트는 Unity 2022.3.4를 기반으로 합니다. 이 프로젝트에는 무언가를 렌더링하고, 렌더링된 결과를 압축한 다음 화면에 표시하는 하나의 장면이 있습니다. 화면에 표시되는 내용은 원본과 압축본의 차이(2배 곱함)뿐만 아니라 알파 채널 및 원본과 압축본 간의 차이도 보여줍니다.
실제 GPU 텍스처 압축기는 외부 프로젝트에서 가져온 코드일 뿐이며, GPUTexCompression/External 아래에 있습니다:
AMD_Compressonator: AMD Compressonator, rev 7d929e9 (2023 Jan 26), MIT 라이선스. 조정 가능한 품질 수준을 가진 BC1 및 BC3 압축을 지원합니다.FastBlockCompress: Microsoft Xbox ATG, rev 180fa6d (2018 Dec 14), MIT 라이선스. BC1 및 BC3 압축을 지원합니다(품질 설정 무시).
더 나은 실시간 컴퓨트 셰이더 텍스처 압축기가 가능할 것이라고 매우 유력하며, 위에 언급된 두 가지는 이미 HLSL로 작성되어 있는 것들일 뿐입니다. 또한 Betsy도 있지만, 이것은 GLSL로 작성되었으며 아마도 다른 것도 있을 수 있습니다. 이 예제는 압축기 자체에 관한 것이라기보다는
AI 자동 생성 콘텐츠
본 콘텐츠는 GitHub GameDev의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기