저자: Josh Barczak

Josh Barczak은 GPU raytracing architecture와 3D API evolution에 집중하고 있는 AMD Fellow입니다. 그는 약 6년 동안 GPU hardware와 software architecture를 즐겁게 다뤄 왔습니다. 그 이전에는 게임 업계에서 rendering lead로 일한 경험이 있습니다.
Dense Geometry Format(DGF)은 AMD의 흥미로운 신기술이며, 저희도 여러 차례 이 주제에 대해 글을 쓴 바 있습니다. AMD DGF가 익숙하지 않다면, 이전 글(여기, 그리고 여기), 기술 논문은 여기, 그리고 Vulkan®을 위한 multi-vendor DGF extension을 Samsung과 함께 개발하는 파트너십을 다룬 최신 블로그를 먼저 읽어 보시길 권합니다.
저희는 최근 AMD DGF SDK 업데이트를 릴리스했으며, 몇 가지 새로운 요소가 추가되었습니다. 전체 목록은 v1.2 release notes를 참고해 주세요. 이 블로그 글에서는 저희가 특히 기대하고 있는 새로운 기능인 DGF SuperCompression(DGFS)에 초점을 맞추겠습니다.
Ray tracing API, 과거와 미래
현재 ray tracing acceleration structure에 대한 API 설계는 일종의 “black box”입니다. 중립적인 입력 포맷이 driver에 의해 hardware-specific format으로 변환되는 구조입니다. 이 방식은 구현체에 상당한 유연성을 제공했습니다. API evolution 과정에서는 필요한 단계였지만, 동시에 몇 가지 근본적인 한계도 갖고 있습니다.
- “pre-build” memory를 위한 allocation은 최악의 compression rate를 기준으로 크기를 잡아야 합니다. 이는 최소 footprint를 키우고, build process에 복잡성과 비효율을 더합니다.
- 구현체는 index reference를 위해 입력 triangle order를 정확히 재현할 수 있을 만큼 충분한 정보를 저장해야 하며, 이는 memory consumption을 증가시킵니다.
- 구현체는 입력을 hardware format으로 변환해야 합니다. 이는 결국 performance, silicon area, power 중 하나 또는 여러 항목에 영향을 줍니다. Mandatory runtime transcode는 더 조밀하지만 encode하기 어려운 design space를 구현체가 선택하는 것을 주저하게 만듭니다. 결과적으로 memory consumption이 간접적으로 증가합니다.
Software developer들은 이러한 한계를 해결하기 위해, 표준화된 효율적인 geometry compression format을 만들고 싶다는 관심을 보여 왔습니다. DGF는 바로 이 역할을 채웁니다. Texture compression에서 DXT, ETC, ASTC 같은 포맷이 해 온 일을 geometry compression에서 수행하는 것입니다.
DGF SuperCompression: 동기
DGF는 무엇보다 먼저 효율적인 hardware format으로 설계되었습니다. DGF의 설계는 특정 triangle에 필요한 모든 정보를 단 한 번의 128B aligned memory read로 접근할 수 있도록 보장합니다. 이 특성은 효율적인 hardware ray traversal에는 필수적이지만, storage format으로 보면 덜 매력적으로 만드는 결과도 낳습니다. Vertex position과 compression parameter는 여러 block에 걸쳐 중복 저장되어야 하고, data alignment를 위해 pad bit도 삽입되어야 합니다. 특히 block이 가득 차 있지 않을 때는 더 그렇습니다.
저희는 이 문제를 해결하기 위해 DGF SuperCompression(DGFS)을 도입했습니다. DGFS는 DGF data를 한 번 더 압축해 storage cost를 줄이는 software system입니다. DGFS로 encode된 geometry는 더 이상 hardware가 직접 소비할 수는 없지만, 상당히 더 작게 만들 수 있습니다. DGFS는 주어진 입력 DGF block set을 정확히 재구성할 수 있으며, conventional vertex buffer와 index buffer로 효율적으로 decode하는 것도 지원합니다. 덕분에 DGFS content는 non-DGF hardware에서도 실행될 수 있습니다.
Texture compression 비유로 돌아가 보겠습니다. DGFS는 DGF에 대해 Basis Universal™이 DXT에 대해 수행하는 역할을 합니다.
Asset package에 DGFS를 도입하면 DGF block을 직접 저장하는 것에 비해 두 가지 중요한 장점이 있습니다.
- Compressed file size를 최대 22%까지 줄일 수 있습니다.
- DGF device와 non-DGF device를 공통 asset format으로 동시에 target할 수 있습니다.
Portable, cluster-granular compression
Rendering engine은 점점 더 작고 self-contained한 triangle cluster를 중심으로 설계되고 있습니다. 이러한 cluster, 또는 “Meshlet”은 GPU Driven Rendering Pipeline을 구성하거나, 세밀한 level of detail system을 만드는 데 사용됩니다. Triangle cluster는 culling, animation, LOD, geometry streaming을 위한 논리적인 작업 단위입니다. 이런 이유로 DGFS에서는 cluster-granular compression system을 사용합니다. 즉, 각 triangle cluster가 독립적으로 압축되고 독립적으로 decode됩니다.
일부 관찰자들은 DGF를 cluster-level acceleration structure(CLAS)의 발전에 대한 “response”라고 설명하기도 했습니다. 이런 오해가 어디서 나오는지는 쉽게 이해할 수 있지만, 정확한 설명은 아닙니다. DGF는 cluster-level acceleration structure(CLAS)의 발전에 대한 response가 아니라, 그와 직교하면서도 상호 보완적인 기술입니다. BLAS는 vertex/index data array로 만들 수도 있고, DGF block array로 만들 수도 있습니다. CLAS 역시 훨씬 작은 같은 종류의 array로 만들 수 있습니다. Pre-compressed geometry는 두 경우 모두에 동일한 이점을 제공합니다.
DGFS stream은 아래 그림처럼 indexed mesh 또는 DGF block array 중 어느 쪽으로도 쉽게 decode될 수 있도록 설계되어 있습니다. DGFS를 사용하면 application은 사실상 하나의 비용으로 두 가지 geometry representation을 저장하는 셈입니다. 덕분에 title은 공통 storage format으로 DGF device와 non-DGF device를 쉽게 함께 target할 수 있습니다.

DGFS compression 세부 사항
DGFS byte stream은 최대 256개의 unique vertex와 triangle로 이루어진 cluster를 variable-length로 압축 encoding한 것입니다. Stream은 DGF block으로부터 만들어지며, 정확히 같은 block set을 재구성하는 데 필요한 최소한의 정보만 저장합니다. DGFS stream 위에 general-purpose compression을 적용했을 때 compressibility를 높이기 위해, 필요한 곳에서는 추가적인 data transformation, 즉 zig-zag encoding, delta encoding, byte interleaving도 수행됩니다.
Vertex storage
Block 사이에 중복되는 vertex는 DGF data를 super-compress할 수 있는 중요한 기회를 제공합니다. 아래 이미지는 triangle cluster가 여러 DGF block으로 분해된 모습을 보여 주며, 각 block은 색상으로 구분되어 있습니다. 회색 vertex는 block boundary 위에 놓여 있으며, 둘 이상의 block에 저장되어야 합니다. 이런 vertex가 아주 많지는 않지만, 무언가 조치를 취할 만큼은 충분히 있습니다.

DGFS encoder는 먼저 block vertex를 decode하고, 공통 encoding space(anchor, exponent, offset size)를 구성합니다. 그런 다음 모든 vertex를 이 공통 공간으로 변환하고, duplicate를 제거합니다. Unique position은 delta로 변환되고, zig-zag encode된 뒤, byte-interleaved struct-of-array 형태로 저장됩니다. 저희는 이 layout이 DGFS stream 위에 general-purpose compression을 적용했을 때 compression rate를 개선한다는 것을 확인했습니다.
Compressed stream 안에서 이러한 vertex들은 매우 특정한 순서로 배치됩니다. Unique vertex는 block 안에서 처음 등장한 순서대로 vertex array의 앞쪽에서부터 index됩니다. Duplicate vertex는 뒤쪽에 배치되고, 뒤쪽에서부터 index됩니다. 왜 이런 순서를 사용하는지는 곧 설명하겠습니다. 아래 다이어그램은 세 개의 예시 block에 대한 layout을 보여 줍니다.

원래의 DGF block을 재구성하려면 각 block 안의 각 position에 어떤 vertex position이 들어 있는지 알려 주는 vertex table을 저장해야 합니다. 각 block마다 이런 table이 하나씩 있습니다. 저희가 사용하는 vertex ordering 덕분에 이 table을 매우 작게 만들 수 있습니다. 각 block vertex마다 그것이 “unique” vertex set에 속하는지, 아니면 “shared” vertex set에 속하는지를 나타내는 bit 하나만 저장합니다. Unique vertex의 index는 running counter를 증가시키면서 계산할 수 있고, shared vertex의 index는 직접 저장할 수 있습니다. Shared vertex를 vertex array의 뒤쪽에서부터 index하면 vertex table에 더 작은 index value를 저장할 수 있습니다. 아래 다이어그램은 vertex table layout을 보여 줍니다.

DGF block으로 decode할 때는 vertex table을 사용해 cluster vertex buffer에서 vertex를 선택하고 block 안에 pack합니다. Meshlet으로 decode할 때는 block-level vertex index를 cluster-level index로 변환해, duplicated position이 없는 meshlet을 생성하는 데 사용합니다.
Geometry ID와 topology
Geometry ID에도 de-duplication을 적용합니다. DGF block에는 GeomID Palette 구조가 들어 있다는 점을 떠올려 봅시다. 여기서 block의 각 triangle은 unique geometry ID와 flag value set에서 작은 selector를 저장합니다. DGFS에서는 ID value를 block 사이에서 de-duplicate하고, delta encoding과 variable byte length를 사용해 저장합니다. 그런 다음 block-level structure는 대응되는 cluster-level structure로 들어가는 index를 저장하도록 수정되며, 이로써 크기를 크게 줄일 수 있습니다.
Topology의 경우 DGF가 이미 매우 compact한 topology representation을 저장하고 있으므로, 이를 추가로 압축하려고 하지는 않습니다. 대신 각 block의 triangle control bit와 compressed index buffer를 DGFS stream 안에 그대로 embed합니다.
결과
아래 표는 다양한 model에 대해 DGF block과 uncompressed DGFS stream의 raw storage footprint를 보여 줍니다. Raw form 기준으로 DGFS는 DGF보다 대략 30% 작습니다.
Crab Dragon Statuette Buddha Bike
| Triangles(Millions) | 2.14 | 7.22 | 10.00 | 1.09 | 1.68 |
| DGF Size (MB) | 10.22 | 29.25 | 40.99 | 4.94 | 6.96 |
| DGFS Size (MB) | 8.48 | 20.15 | 29.31 | 3.95 | 5.54 |
| Savings | 17.06% | 31.09% | 28.48% | 20.03% | 20.47% |
Gaming scenario에서는 DGFS data가 memory에 계속 남아 있지 않으므로, disk 위에서의 compressed size가 더 중요한 측정값입니다. 아래 표는 data에 GDeflate compression을 적용했을 때의 결과 크기를 보여 줍니다. 둘 다 compression을 적용했을 때, DGFS는 DGF보다 대략 20% 작습니다.
Crab Dragon Statuette Buddha Bike
| Triangles(Millions) | 2.14 | 7.22 | 10.00 | 1.09 | 1.68 |
| DGF Size (MB) | 7.19 | 20.15 | 28.65 | 3.35 | 4.56 |
| DGFS Size (MB) | 5.73 | 15.67 | 23.31 | 2.63 | 3.69 |
| Savings | 20.29% | 22.22% | 18.61% | 21.34% | 19.04% |
마지막으로 decoding speed를 살펴보는 것도 중요합니다. 아래 결과는 single CPU core 기준이며, 매우 거대한 model도 아주 짧은 시간 안에 decode할 수 있음을 보여 줍니다. 여기의 결과는 streaming 중 CPU-based decoding이 충분히 빠를 것임을 시사합니다. 그렇다고 해서 GPU-based decoder를 막는 것은 아무것도 없습니다. DGFS decoder의 wave-vectorized version은 충분히 가능하며, 좋은 성능을 낼 수 있을 것입니다.
Crab Dragon Statuette Buddha Bike
| Triangles(Millions) | 2.14 | 7.22 | 10.00 | 1.09 | 1.68 |
| Meshlet Decode Time (sec) | 0.03 | 0.09 | 0.15 | 0.02 | 0.02 |
| DGF Decode Time (sec) | 0.05 | 0.15 | 0.22 | 0.03 | 0.04 |
Decode time 결과는 AMD Ryzen™ 9 7950X 16-core processor, 64GB DDR5 6000 RAM, AMD Radeon™ RX 9070 XT graphics card, MSI PRO PRO X670-P WIFI motherboard, Microsoft Windows 11 2025 Update를 사용한 시스템에서 생성되었습니다.
지금 DGFS 시작하기
저희는 AMD DGF를 확장해 한층 더 큰 이점을 제공하는 기술인 DGF SuperCompression(DGFS)을 소개했습니다. DGFS를 도입하면 vanilla DGF 대비 disk footprint와 download size를 최대 22%까지 크게 줄일 수 있으며, non-DGF device를 target하기 위한 효율적인 fallback path도 자동으로 확보할 수 있습니다.
Next-gen에 초점을 맞춘 engine developer나 technical artist라면 AMD DGF SDK를 다운로드하고, 이 기술이 여러분의 workflow에 어떻게 들어맞을지 생각해 보시길 권합니다. AMD Developer Community에서의 feedback과 일반적인 질문도 언제든 환영합니다.
각주
Third party site로 연결되는 link는 편의를 위해 제공됩니다. 명시적으로 언급되지 않는 한, AMD는 이러한 link site의 content에 대해 책임지지 않으며 endorsement를 의미하지도 않습니다. GD-97.
“Samsung” name, “Samsung logo” 및 관련 name, logo, product/service name, design, slogan은 Samsung Electronics Co., Ltd.의 trademark입니다.
Basis Universal™은 Binomial LLC의 registered trademark입니다.
Vulkan 및 Vulkan logo는 Khronos Group Inc.의 registered trademark입니다.
원문
Introducing AMD DGF SuperCompression - AMD GPUOpen
Introducing AMD DGF SuperCompression - AMD GPUOpen
AMD DGF SuperCompression (DGFS) cuts DGF geometry file sizes while preserving exact block reconstruction and enabling fast decode to either DGF blocks or conventional meshlets for cross-device deployment.
gpuopen.com
'TECH.ART.FLOW.IO' 카테고리의 다른 글
| [번역][FAB] VBAO – Visibility Bitmask Ambient Occlusion (0) | 2026.05.27 |
|---|---|
| YOUTUBE 에서 Transcript 추출 및 mp3 변환 툴|로컬AI추가 (0) | 2026.05.27 |
| [번역][NVIDIA] Depth Precision Visualized (0) | 2026.05.25 |
| [번역] 넷이즈 레이훠 LGDC 시리즈 게임 개발에서 비바람을 부르는 마법(하편): 3D 번개, 폭풍운, 지표면 구름바다 효과 공유 (0) | 2026.05.25 |
| [번역] 넷이즈 레이훠 LGDC 시리즈|게임 개발에서 ‘마법’처럼 쓰이는 기술(상): 날씨 시스템 설계와 실전 (0) | 2026.05.24 |