황현동 블로그 개발, 인생, 유우머

260219 3D Voxel 기술 심층분석

Tags:

🔍 260219 3D_Voxel_기술_심층분석

📝 작성일: 2026-02-19
💡 분류: 3D Graphics / Volumetric Data / Computer Science
💡 키워드: Voxel, Volume Element, Octree, Marching Cubes, Ray Marching, GPU Rendering, OpenVDB, NanoVDB


📚 목차

  1. Voxel 기본 개념 및 원리
  2. Voxel 자료구조
  3. Voxel 관련 핵심 알고리즘
  4. Voxel 렌더링 기법
  5. Voxel 최적화 기법
  6. 실제 활용 사례
  7. Voxel vs Mesh vs Point Cloud 비교
  8. 참고 자료 및 출처

🧠 1. Voxel 기본 개념 및 원리

🧠 1.1 Voxel의 정의

VoxelVolume Element 또는 Volumetric Pixel의 약어로, 3차원 공간에서 정규 격자(regular grid) 위의 한 값을 표현하는 기본 단위이다. 2차원 이미지에서 Pixel이 화면의 최소 단위인 것처럼, Voxel은 3차원 공간에서의 최소 단위 역할을 한다. 각 Voxel은 공간 내 특정 위치에 존재하며, 색상(color), 밀도(density), 투명도(opacity), 재질(material) 등의 속성값을 담을 수 있다.

Voxel이라는 용어는 1970년대 후반부터 의료 영상 분야에서 CT와 MRI 데이터를 표현하기 위해 사용되기 시작했으며, 이후 컴퓨터 그래픽스, 게임, 과학 시뮬레이션 등 다양한 영역으로 확장되었다.

⚖️ 1.2 Pixel vs Voxel 비교

항목 Pixel (2D) Voxel (3D)
차원 2차원 (x, y) 3차원 (x, y, z)
형태 정사각형 정육면체 (Cube)
인접 요소 수 최대 8개 (상하좌우 + 대각선) 최대 26개 (면 6 + 모서리 12 + 꼭짓점 8)
해상도 증가 시 메모리 O(N^2) O(N^3)
대표 형식 PNG, JPEG, BMP DICOM, NIfTI, VDB
주요 응용 2D 이미지, UI 의료영상, 3D 게임, 시뮬레이션

Voxel의 인접성(adjacency)은 3D 공간에서 세 가지 수준으로 정의된다:

  • 6-adjacency (면 공유): 상, 하, 좌, 우, 앞, 뒤의 6개 이웃
  • 18-adjacency (면 + 모서리 공유): 6-adjacency + 모서리를 공유하는 12개 이웃
  • 26-adjacency (면 + 모서리 + 꼭짓점 공유): 모든 방향의 26개 이웃

이 인접성 개념은 3D Flood Fill, 연결 요소 분석(Connected Component Analysis), 경로 탐색 등 다양한 복셀 알고리즘의 기초가 된다.

💡 참고: Voxelisation Algorithms and Data Structures: A Review (MDPI)

🔹 1.3 3D 격자(Grid) 표현 방식

Voxel은 3차원 공간을 균일한 격자(Uniform Grid)로 분할하여 표현한다. 공간 전체를 N x N x N 크기의 3D 배열로 나누고, 각 셀(cell)에 해당 위치의 속성을 저장하는 것이 가장 기본적인 방식이다.

3D Voxel Grid 개념도:

    z
    |  / y
    | /
    |/______ x

    각 격자 셀 = 하나의 Voxel
    Voxel[x][y][z] = { color, density, material, ... }

공간 해상도(resolution)는 각 축 방향의 Voxel 수로 결정되며, 해상도가 높을수록 더 정밀한 표현이 가능하지만 메모리 사용량이 급격히 증가한다.

🔹 1.4 해상도와 메모리 관계

Voxel 격자의 메모리 소비는 해상도의 세제곱에 비례한다. 이것이 Voxel 기술의 가장 큰 도전 과제 중 하나이다.

해상도 (N^3) Voxel 수 메모리 (1 byte/voxel) 메모리 (4 bytes/voxel)
64^3 262,144 256 KB 1 MB
128^3 2,097,152 2 MB 8 MB
256^3 16,777,216 16 MB 64 MB
512^3 134,217,728 128 MB 512 MB
1024^3 1,073,741,824 1 GB 4 GB
2048^3 8,589,934,592 8 GB 32 GB
4096^3 68,719,476,736 64 GB 256 GB

실측치에 따르면, 512 x 512 x 512 해상도의 복셀 격자는 약 1.34억 개의 데이터포인트를 포함하며 약 2GB의 시스템 메모리를 점유하고, 1024^3 격자는 약 16GB를 소비한다. 이러한 메모리 문제를 해결하기 위해 Sparse Voxel Octree(SVO), VDB, Hash Map 기반 저장 등 다양한 최적화 자료구조가 개발되었다.

💡 참고: Volume Rendering Based On 3D Voxel Grids (Scratchapixel)


🏗️ 2. Voxel 자료구조

Voxel 데이터를 효율적으로 저장하고 접근하기 위한 다양한 자료구조가 존재한다. 각 자료구조는 메모리 효율성, 접근 속도, 수정 용이성 등에서 서로 다른 특성을 가진다.

🧠 2.1 Dense Voxel Grid (밀집 격자)

가장 단순한 형태의 Voxel 저장 방식으로, 3D 배열을 사용하여 모든 Voxel을 빈틈없이 저장한다.

// Dense Grid 저장 구조
VoxelData grid[SIZE_X][SIZE_Y][SIZE_Z];

// 접근: O(1) - 인덱스 직접 접근
VoxelData voxel = grid[x][y][z];

장점:

  • 구현이 매우 단순함
  • O(1) 시간 복잡도로 임의 접근(random access) 가능
  • 캐시 친화적인 연속 메모리 레이아웃

단점:

  • 메모리 사용량이 O(N^3)으로 급격히 증가
  • 빈 공간(empty space)도 메모리를 점유
  • 대규모 씬(scene)에는 비실용적

적합한 상황: 소규모 격자(64^3 ~ 256^3), 대부분의 공간이 채워진 밀집 데이터, 빠른 프로토타이핑

🧠 2.2 Sparse Voxel Octree (SVO)

SVO는 Voxel 데이터를 분기 계수(branching factor) 8의 트리 구조로 저장하며, 비어 있는 영역에 해당하는 브랜치를 가지치기(pruning)하여 메모리를 절약한다.

Octree 분할 원리:

  전체 공간을 8개의 자식 노드로 재귀적으로 분할
  ┌───┬───┐
  │ 0 │ 1 │  <- 상위 레이어
  ├───┼───┤
  │ 2 │ 3 │
  └───┴───┘
  (z축으로 4~7 동일 구조)

  비어 있는 서브트리는 가지치기하여 메모리 절약

SVO의 핵심 구현 요소:

  • 비트마스크(Bitmask): 각 노드의 8개 자식 중 어떤 것이 존재하는지를 8비트 마스크로 표현
  • 포인터(Pointer): 자식 노드가 저장된 메모리 위치를 가리킴
  • 리프 노드(Leaf Node): 실제 Voxel 데이터(색상, 재질 등)를 포함
// SVO 노드 구조 (간략)
struct SVONode {
    uint8_t  childMask;    // 8비트: 어떤 자식이 존재하는지
    uint8_t  leafMask;     // 8비트: 어떤 자식이 리프인지
    uint32_t childPointer; // 첫 번째 자식 노드로의 포인터
};

고급 변형:

  • SVDAG (Sparse Voxel Directed Acyclic Graph): 동일한 서브트리를 공유하여 메모리를 대폭 절감. 정적 격자에서 가장 메모리 효율적인 방식 중 하나.
  • SSVDAG (Symmetry-aware SVDAG): 대칭 변환(회전, 반전)까지 고려하여 추가 압축.

💡 참고: Sparse Voxel Octree (Eisenwave Documentation), Sparse Voxel Octree - Wikipedia

🔹 2.3 Run-Length Encoding (RLE)

RLE는 Voxel 배열에서 연속적으로 동일한 값이 반복되는 구간을 (값, 반복 횟수) 쌍으로 압축하는 기법이다. Voxel 데이터에는 빈 공간이 많아 0x0 값의 긴 연속(run)이 빈번하므로 높은 압축률을 기대할 수 있다.

원본 데이터 (1D 슬라이스):
[0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 2, 2, 2]

RLE 압축 결과:
[(0, 4), (1, 2), (0, 5), (2, 3)]

3D Voxel 데이터에 RLE를 적용할 때는 순회 순서(traversal order)가 압축 효율에 큰 영향을 미친다:

  • 중첩 반복(Nested Iteration): x -> y -> z 순서로 단순 순회
  • Z-Order Curve (Morton Code): 공간적 인접성을 보존하는 곡선 순서
  • Hilbert Curve: Z-Order보다 더 높은 공간 인접성 보존

연구 결과에 따르면, Z-Order Curve 및 Hilbert Curve를 사용한 RLE는 단순 중첩 반복 대비 약 60%의 데이터 크기 감소를 달성한다.

💡 참고: Voxel Compression - Run-Length Encoding (Eisenwave), RLE - Voxel.Wiki

🗄️ 2.4 VDB (OpenVDB / NanoVDB)

VDB는 DreamWorks Animation이 개발하고 Academy Software Foundation이 관리하는 계층적 희소 볼륨 데이터 구조이다. 아카데미상(Academy Award)을 수상한 C++ 라이브러리로, 시간에 따라 변화하는 희소(sparse) 볼륨 데이터를 효율적으로 조작할 수 있다.

VDB 트리 구조 (기본 5단계):

  Root Node (해시 맵)
    └─ Internal Node 1 (32^3)
         └─ Internal Node 2 (16^3)
              └─ Leaf Node (8^3)
                   └─ Voxel Data

OpenVDB의 핵심 특징:

  • 계층적 B+ 트리 구조로 O(1)에 가까운 접근 속도
  • 희소 데이터에 대한 극히 효율적인 메모리 사용
  • 동적 데이터 수정 지원
  • 영화, VFX 산업의 사실상 표준

NanoVDB는 OpenVDB의 GPU 친화적 경량 버전으로 NVIDIA가 개발했다:

  • 포인터 없는(Pointer-less) 설계: 연속된 단일 메모리 블록에 저장
  • 디프래그먼트(Defragmented) 메모리 레이아웃: CPU에서도 OpenVDB 대비 빠른 접근 속도
  • 광범위한 플랫폼 지원: CUDA, OpenCL, OpenGL, DirectX, CPU 모두 지원
  • 용도: GPU 레이 트레이싱, 충돌 감지, 유체 시뮬레이션 경계 조건

💡 참고: OpenVDB About, NanoVDB - NVIDIA Developer, Accelerating OpenVDB on GPUs with NanoVDB (NVIDIA Blog)

🗂️ 2.5 Hash Map 기반 Voxel 저장

공간 해싱(Spatial Hashing)은 3D 좌표를 해시 함수로 변환하여 해시 테이블에 저장하는 방식이다. 실제로 데이터가 존재하는 곳에만 메모리를 할당하므로 극도로 희소한 데이터에 효율적이다.

// Voxel Hashing 개념
hash(x, y, z) -> bucket_index

// 저장: 관측된 표면 근처에만 밀집 블록 할당
VoxelBlock {
    voxels[8][8][8];  // 8^3 밀집 블록
    position: (bx, by, bz);
}

Voxel Hashing의 핵심 아이디어 (Niessner et al., 2013):

  • 개념적으로 무한한 균일 격자가 세계를 Voxel 블록으로 분할
  • 각 블록은 소규모 정규 Voxel 격자(예: 8^3)
  • 관측된 영역에만 블록을 동적으로 할당
  • 플랫 해시 테이블로 O(1) 접근, 완전한 GPU 병렬화 지원
  • 재귀적 옥트리 대비 구현과 GPU 매핑이 단순

💡 참고: Real-time 3D Reconstruction at Scale using Voxel Hashing (Stanford), ASH: A Modern Framework for Parallel Spatial Hashing in 3D Perception (CMU)

🏗️ 2.6 자료구조 비교 요약

자료구조 메모리 효율 접근 속도 수정 용이성 GPU 친화 적합한 상황
Dense Grid 낮음 (O(N^3)) O(1) 매우 쉬움 높음 소규모, 밀집 데이터
SVO 높음 O(log N) 중간 중간 정적, 대규모 장면
SVDAG/SSVDAG 매우 높음 O(log N) 어려움 중간 정적 데이터 압축
RLE 높음 O(N) 순차 어려움 낮음 직렬화, 저장
OpenVDB 높음 O(1)~O(log N) 쉬움 낮음 (CPU) VFX, 시뮬레이션
NanoVDB 높음 O(1)~O(log N) 읽기 전용 매우 높음 GPU 렌더링, 충돌 감지
Hash Map 높음 O(1) 평균 쉬움 높음 실시간 3D 복원

🧠 3. Voxel 관련 핵심 알고리즘

🧠 3.1 Voxelization (메쉬 -> 복셀 변환)

Voxelization은 폴리곤 메쉬(삼각형 기반 표면)를 Voxel 격자로 변환하는 과정이다. 3D 모델링 도구에서 만든 메쉬를 Voxel 기반 시스템에서 활용하려면 반드시 필요한 전처리 단계이다.

주요 Voxelization 방식:

  1. 표면 Voxelization (Surface Voxelization): 메쉬의 표면을 구성하는 삼각형들만 Voxel로 변환. 내부는 비어 있음.

  2. 고체 Voxelization (Solid Voxelization): 메쉬 내부까지 채워진 완전한 Voxel 볼륨 생성. 레이 캐스팅 또는 Flood Fill과 결합하여 내부를 판별.

  3. 보수적 Voxelization (Conservative Voxelization): 삼각형이 Voxel과 조금이라도 겹치면 해당 Voxel을 활성화. 틈(gap) 없는 결과 보장.

연결성(Connectivity) 기준:

  • 6-connected Voxelization: 면을 공유하는 이웃만 연결로 인정. 생성되는 Voxel 수가 많지만 빈틈이 없음.
  • 26-connected Voxelization: 꼭짓점 공유까지 연결로 인정. 약 2배 적은 Voxel 생성으로 계산 비용이 낮음.

GPU 기반 Voxelization: 현대적 접근법은 GPU의 래스터라이제이션 파이프라인을 활용하여 실시간 Voxelization을 수행한다. 지오메트리 셰이더 또는 컴퓨트 셰이더를 통해 삼각형을 3D 텍스처에 직접 기록한다.

💡 참고: Voxelisation Algorithms and Data Structures: A Review (PMC), Encyclopedia MDPI - Voxelisation Algorithms

🔹 3.2 Marching Cubes (복셀 -> 메쉬 변환)

1987년 Lorensen과 Cline이 SIGGRAPH에서 발표한 Marching Cubes는 3차원 이산 스칼라 필드(discrete scalar field)에서 등가면(isosurface)의 폴리곤 메쉬를 추출하는 알고리즘이다. Voxel 데이터를 시각적으로 매끄러운 삼각형 메쉬로 변환하는 데 가장 널리 사용된다.

알고리즘 동작 원리:

1. Voxel 격자의 인접한 8개 꼭짓점으로 큐브를 구성
2. 각 꼭짓점의 스칼라 값을 임계값(threshold)과 비교
3. 임계값 이상이면 1, 미만이면 0으로 분류
4. 8개 꼭짓점의 내외부 조합 -> 2^8 = 256가지 경우
5. 사전 계산된 룩업 테이블(Lookup Table)로 삼각형 구성 결정
6. 선형 보간(Linear Interpolation)으로 삼각형 꼭짓점의 정확한 위치 계산
7. 격자 전체를 순회하며 위 과정 반복 ("Marching")

256가지 경우의 수: 실제로는 대칭성과 회전 동치를 고려하면 15가지 기본 패턴으로 축소된다.

15가지 기본 Marching Cubes 케이스:

Case 0: 모든 꼭짓점이 외부 (삼각형 없음)
Case 1: 한 꼭짓점만 내부 (삼각형 1개)
Case 2: 인접 두 꼭짓점 내부 (삼각형 2개)
...
Case 14: 한 꼭짓점만 외부 (삼각형 1개)

한계와 개선:

  • 모호성(Ambiguity) 문제: 특정 구성에서 여러 유효한 삼각형 배치가 가능하여 메쉬에 구멍(hole)이 생길 수 있음
  • Marching Tetrahedra: 큐브 대신 사면체를 사용하여 모호성 해결
  • Transvoxel: Marching Cubes를 확장하여 서로 다른 LOD 간의 이음새(seam) 없는 메쉬 생성

💡 참고: Marching Cubes - Wikipedia, Marching Cubes Algorithm: Converting Voxel Data to Mesh Surfaces (Patsnap Eureka)

🔹 3.3 Ray Marching / Ray Casting

Ray Marching은 카메라에서 각 픽셀 방향으로 광선(ray)을 발사하고, 일정 간격으로 전진하며 Voxel 격자를 샘플링하는 렌더링 기법이다.

기본 Ray Marching 알고리즘:

for each pixel:
    ray = camera_origin + t * direction
    t = 0
    while t < max_distance:
        position = ray_at(t)
        voxel = lookup(position)
        if voxel is solid:
            color = shade(voxel, position)
            break
        t += step_size

DDA (Digital Differential Analyzer) 기반 Ray Marching:

격자 구조의 특성을 활용하여 광선이 각 Voxel 경계를 정확히 교차하는 지점만 검사하는 최적화 기법이다. 모든 Voxel 사이 평면(N+1개)과의 교차점을 계산하여 빈 공간을 효율적으로 건너뛴다.

Cube-Assisted Ray Marching: 현재 위치에서 가능한 최대 크기의 빈 큐브를 계산하고, 해당 크기만큼 한 번에 전진한다. 단순 고정 스텝 대비 약 10배 이상의 성능 향상이 보고되었다.

💡 참고: Raymarching Voxel Rendering (Medium), Voxel Raymarching (Tenebryo)

🔹 3.4 Flood Fill (3D 영역 채우기)

2D Flood Fill의 3D 확장으로, 시작 Voxel에서 인접한 동일 속성의 Voxel들을 재귀적 또는 반복적으로 탐색하여 영역을 채우는 알고리즘이다.

// 3D Flood Fill (BFS 방식)
function floodFill3D(grid, start, newValue):
    queue = [start]
    oldValue = grid[start]
    while queue is not empty:
        current = queue.dequeue()
        if grid[current] == oldValue:
            grid[current] = newValue
            for each neighbor in 6-adjacent(current):  // 또는 26-adjacent
                if inBounds(neighbor) and grid[neighbor] == oldValue:
                    queue.enqueue(neighbor)

활용 분야:

  • Solid Voxelization에서 메쉬 내부 판별
  • 게임에서 파괴 가능한 지형의 연결 요소 분리 감지
  • 의료 영상에서 특정 조직/장기의 세그멘테이션

🧠 3.5 Voxel Cone Tracing (글로벌 일루미네이션)

2011년 Cyril Crassin 등이 제안한 기법으로, Voxel 기반의 실시간 글로벌 일루미네이션(Global Illumination)을 구현한다. 수백 개의 개별 광선 대신 4~6개의 원뿔(cone)을 추적하여 간접 조명을 근사한다.

동작 과정:

1단계: Scene Voxelization
  - 장면을 3D 텍스처로 Voxelization
  - 각 Voxel에 직접 조명(direct lighting) 정보 저장

2단계: Mipmap 생성
  - Voxel 3D 텍스처의 밉맵 체인 생성
  - 상위 밉맵 = 하위 영역의 통합된 조명/차폐 정보

3단계: Cone Tracing
  - 표면의 각 점에서 반구 방향으로 4~6개 원뿔 발사
  - 원뿔이 원점에서 멀어질수록 aperture(개구) 증가
  - 더 높은 밉맵 레벨에서 샘플링 -> 먼 곳일수록 낮은 해상도
  - 선형 시간(O(N))에 간접 조명 계산

구현 가능한 효과: 디퓨즈 간접 조명(Diffuse GI), 스페큘러 반사(Specular Reflections), 소프트 섀도우(Soft Shadows), 앰비언트 오클루전(Ambient Occlusion), 발광 재질(Emissive Materials)에 의한 영역 조명

💡 참고: Voxel-based Global Illumination (Wicked Engine), Voxel Cone Tracing and Sparse Voxel Octree for Real-time GI (NVIDIA GTC 2012)


🧠 4. Voxel 렌더링 기법

🔹 4.1 Direct Volume Rendering (DVR)

의료 영상 등 연속적인 볼륨 데이터를 직접 시각화하는 기법으로, 중간 표면 추출 단계 없이 볼륨 전체를 렌더링한다. 각 Voxel의 밀도 값에 전달 함수(Transfer Function)를 적용하여 색상과 불투명도를 결정한다.

Volume Rendering Integral:

  I = integral_0^D T(t) * sigma(t) * c(t) dt

  여기서:
  T(t) = exp(-integral_0^t sigma(s) ds)  : 투과율(transmittance)
  sigma(t) : 흡수 계수 (absorption coefficient)
  c(t) : 방출 색상 (emission color)
  D : 광선 이동 거리

이 적분을 이산화하여 Front-to-Back 또는 Back-to-Front 순서로 합성(compositing)한다.

🔹 4.2 Splatting

각 Voxel을 화면 공간(screen space)에 투영하여 가우시안(Gaussian) 커널로 확산시키는 기법이다. 일종의 “역방향 레이 캐스팅”으로 볼 수 있다.

Splatting 과정:
1. 각 Voxel을 화면에 투영
2. 2D 가우시안 커널(footprint)로 주변 픽셀에 기여도 분배
3. 모든 Voxel의 기여를 누적하여 최종 이미지 생성

장점: 구현이 비교적 단순하고, 희소 데이터에서 효율적
단점: 정확한 오클루전(occlusion) 처리가 어렵고, 밀집 데이터에서 느림

🎮 4.3 Ray Casting 기반 볼륨 렌더링

현재 가장 널리 사용되는 볼륨 렌더링 기법으로, 각 화면 픽셀에서 광선을 발사하여 볼륨을 통과하며 샘플링한다.

Ray Casting Volume Rendering:

for each pixel:
    ray = generate_ray(pixel)
    accumulated_color = (0, 0, 0, 0)

    for t = t_enter to t_exit step dt:
        sample = trilinear_interpolate(volume, ray_at(t))
        color, opacity = transfer_function(sample)

        // Front-to-back compositing
        accumulated_color.rgb += (1 - accumulated_color.a) * opacity * color
        accumulated_color.a   += (1 - accumulated_color.a) * opacity

        if accumulated_color.a >= 0.99:  // Early ray termination
            break

최적화 기법:

  • Early Ray Termination: 누적 불투명도가 거의 1에 도달하면 조기 종료
  • Empty Space Skipping: 빈 영역을 건너뛰어 불필요한 샘플링 회피
  • Adaptive Sampling: 변화가 큰 영역에서 샘플 간격을 줄여 정밀도 향상

🎮 4.4 GPU 가속 볼륨 렌더링

현대적 볼륨 렌더링은 GPU의 대규모 병렬 처리 능력을 활용한다.

GPU 구현 방식:

  • 3D 텍스처 기반: 볼륨 데이터를 GPU의 3D 텍스처에 저장, 하드웨어 트리리니어 보간 활용
  • 컴퓨트 셰이더 기반: CUDA 또는 OpenCL 커널로 Ray Casting 수행
  • 프래그먼트 셰이더 기반: 바운딩 박스의 앞뒤 면을 렌더링하여 광선 진입/탈출점 계산

2025년에 발표된 Aokana 프레임워크는 오픈 월드 게임을 위한 GPU 주도 Voxel 렌더링 파이프라인으로, Efficient Sparse Voxel Octree(ESVO) 구조를 사용하며, 청크 선택(chunk selection), 타일 선택(tile selection), 레이 마칭(ray marching), Hi-Z 빌딩 패스를 모두 컴퓨트 셰이더로 실행한다.

Hybrid Voxel Formats (2024): 균일 Voxel 격자(Raw), 거리장(Distance Field), SVO, SVDAG 등 네 가지 기본 포맷의 계층적 조합으로, 메모리 소비와 렌더링 속도 간의 파레토 최적 트레이드오프를 달성한다. 각 계층 레벨마다 서로 다른 구조를 사용할 수 있다.

💡 참고: Aokana: A GPU-Driven Voxel Rendering Framework (arXiv 2025), Hybrid Voxel Formats for Efficient Ray Tracing (arXiv 2024), A Guide to Fast Voxel Ray Tracing Using Sparse 64-Trees


🚀 5. Voxel 최적화 기법

🔹 5.1 LOD (Level of Detail)

Voxel 시스템에서 LOD는 카메라와의 거리에 따라 Voxel 해상도를 동적으로 조절하는 기법이다.

LOD 레벨별 해상도 변화:

LOD 0: 32^3 청크 (원본 해상도) - 가장 가까운 영역
LOD 1: 64^3 영역을 32^3로 (Voxel 크기 2x) - 중간 거리
LOD 2: 128^3 영역을 32^3로 (Voxel 크기 4x) - 먼 거리
LOD 3: 256^3 영역을 32^3로 (Voxel 크기 8x) - 매우 먼 거리

LOD 적용 시 핵심 과제:

  • 이음새(Seam) 처리: 인접한 LOD 레벨 간 경계에서 균열(crack)이 발생하지 않도록 처리. Transvoxel 알고리즘이나 Vertex Morphing으로 해결.
  • 암시적 옥트리(Implicit Octree): CPU 측에서 청크를 조직하여 LOD 오류(error)를 카메라 위치, 청크 위치/크기에 따라 평가하고 재귀적으로 로딩 결정.

💡 참고: A Level of Detail Method for Blocky Voxels (0fps.net), World Size and Level Of Details (Voxel Plugin)

🏗️ 5.2 Sparse Voxel 구조 최적화

앞서 설명한 SVO, SVDAG, VDB 등의 희소 자료구조는 그 자체로 강력한 최적화 기법이다. 추가적인 최적화 전략:

  • 서브트리 공유 (Subtree Sharing): SVDAG에서 동일한 서브트리를 하나의 인스턴스로 공유하여 메모리 대폭 절감
  • 양자화 (Quantization): Voxel 속성값의 비트 수를 줄여 메모리 절약 (예: 32비트 색상 -> 8비트 팔레트 인덱스)
  • 비트 압축 (Bit Packing): 불리언 점유(occupancy) 데이터를 비트 단위로 압축

🚀 5.3 GPU 메모리 최적화

  • Brick Map / Brick Pool: 작은 3D 텍스처 블록(brick)으로 분할하여 GPU 텍스처 아틀라스에 팩킹
  • Virtual Texturing: 필요한 부분만 GPU 메모리에 로드하는 가상 텍스처링
  • Sparse Texture: OpenGL의 GL_ARB_sparse_texture 확장으로 실제 데이터가 있는 영역만 물리 메모리 할당
  • Compression: GPU 하드웨어 텍스처 압축(BC7, ASTC 등) 활용

🔹 5.4 스트리밍 및 청크 시스템

대규모 Voxel 세계(Minecraft 스타일)에서는 전체 데이터를 한 번에 메모리에 올릴 수 없으므로, 청크(Chunk) 단위로 분할하여 스트리밍한다.

청크 스트리밍 시스템 구조:

  ┌─────────────────────────────┐
  │        월드 (World)          │
  │  ┌───┬───┬───┬───┬───┐     │
  │  │ C │ C │ C │ C │ C │     │  C = Chunk (예: 16^3 또는 32^3)
  │  ├───┼───┼───┼───┼───┤     │
  │  │ C │ L │ L │ L │ C │     │  L = Loaded (메모리에 적재됨)
  │  ├───┼───┼───┼───┼───┤     │
  │  │ C │ L │ P │ L │ C │     │  P = Player 위치
  │  ├───┼───┼───┼───┼───┤     │
  │  │ C │ L │ L │ L │ C │     │
  │  ├───┼───┼───┼───┼───┤     │
  │  │ C │ C │ C │ C │ C │     │
  │  └───┴───┴───┴───┴───┘     │
  └─────────────────────────────┘

스트리밍 전략:

  • 동심 박스(Concentric Box) 방식: 시청자 주변에 동심 사각형 영역으로 청크 로드. 다중 뷰어 및 충돌 전용 뷰어 지원.
  • 구형(Spherical) 방식: 시청자 중심 구 형태로 청크 로드. 단일 뷰어에 적합.
  • 우선순위 큐(Priority Queue): 카메라 방향, 거리, 변경 빈도 등을 고려하여 로드 순서 결정.

💡 참고: VoxelLodTerrain (Voxel Tools Documentation)


🏢 6. 실제 활용 사례

🔹 6.1 게임

Minecraft (Mojang, 2011):

  • 세계에서 가장 많이 팔린 게임(3억 장 이상)으로 Voxel의 대중화를 이끔
  • 16^3 x 256(높이) 크기의 청크 기반 구조
  • 각 Voxel이 블록 타입(흙, 돌, 물 등)을 나타냄
  • 절차적 지형 생성(Perlin Noise)과 완전한 파괴/건설 시스템

Teardown (Tuxedo Labs, 2022):

  • 완전 파괴 가능한 Voxel 환경을 실시간 레이 트레이싱으로 렌더링
  • 8비트 색상 팔레트로 각 재질의 색상, 거칠기, 발광, 반사도, 물리 타입 결정
  • 전통적인 단일 볼륨 대신 여러 개의 소규모 Voxel 볼륨 사용으로 충돌 감지 복잡도 감소
  • 개발자 Dennis Gustafsson은 2024년 후반 더 개선된 새로운 Voxel 엔진을 예고

💡 참고: Teardown - Wikipedia, How Beautiful Voxels Laid the Way for Teardown (Game Developer)

🔹 6.2 의료 영상 (CT, MRI)

의료 영상은 Voxel 기술의 가장 오래되고 중요한 응용 분야 중 하나이다.

  • CT (Computed Tomography): X선을 여러 각도에서 촬영하여 단면 이미지의 스택(stack)을 생성. 각 Voxel값은 Hounsfield Unit (HU)으로 조직의 밀도를 나타냄.
  • MRI (Magnetic Resonance Imaging): 자기장과 라디오파를 이용하여 연조직의 고대비 볼륨 데이터 생성. Voxel값은 신호 강도(Signal Intensity).
  • DICOM 형식: 의료 영상의 표준 포맷. Pixel Spacing과 Slice Thickness 필드로 Voxel 크기 계산.

볼륨 렌더링의 의료 응용:

  • 가상 내시경(Virtual Endoscopy): CT 데이터로 대장 내부를 비침습적으로 관찰
  • 3D 수술 계획: 종양의 3D 위치와 주변 혈관 관계 시각화
  • Marching Cubes로 CT 스택에서 뼈, 장기 표면 메쉬 추출

💡 참고: Voxel Size (Radiopaedia), Volume Rendering for Medical Data (Vision Systems Design)

🔹 6.3 지형 생성 및 파괴 시스템

Voxel은 동적으로 변형 가능한 지형 시스템의 핵심 기술이다.

  • 절차적 지형 생성: Perlin/Simplex Noise를 3D Voxel 밀도 필드로 사용하여 동굴, 절벽, 오버행(overhang) 등 복잡한 지형 생성
  • 파괴 시스템: Voxel 값을 직접 수정하여 지형 파괴 구현. 구형(spherical) 감소, 빔(beam) 절단 등 다양한 형태 가능
  • CSG (Constructive Solid Geometry): Voxel 필드 간 합집합, 교집합, 차집합 연산으로 복잡한 형상 조합

🔹 6.4 3D 스캐닝 및 포인트 클라우드

LiDAR, 구조광(Structured Light), 스테레오 카메라 등으로 취득한 포인트 클라우드를 Voxel 격자로 통합(fusion)하여 완전한 3D 모델을 구축한다.

  • TSDF (Truncated Signed Distance Function): KinectFusion에서 사용된 기법으로, 각 Voxel에 가장 가까운 표면까지의 부호 거리(signed distance)를 저장
  • Voxel Hashing: Niessner et al. (2013)의 실시간 대규모 3D 복원 기법
  • SLAM 통합: 로봇/드론의 자율 주행에서 LiDAR 포인트를 Voxel 맵으로 융합하여 3D 환경 인식

💡 참고: Real-time 3D Reconstruction at Scale using Voxel Hashing (Stanford)

🏢 6.5 CAD/BIM/건축 분야

  • Scan-to-BIM: 실제 건물을 3D 스캐닝하여 포인트 클라우드를 취득하고, 이를 BIM(Building Information Modeling) 모델로 변환. 밀리미터 단위의 정밀 측정 가능.
  • 공간 분석: Voxel 기반으로 건물 내부 공간의 채광, 환기, 동선 등을 시뮬레이션
  • 충돌 감지(Clash Detection): Voxel 격자에서 서로 다른 건축 요소(배관, 덕트, 구조물)의 간섭을 빠르게 탐지

💡 참고: Scan to BIM (Autodesk), 3D Laser Scanning for AEC (Laser Design)

🔹 6.6 산업용 프레임워크

OpenVDB (Academy Software Foundation):

  • DreamWorks Animation이 개발, 아카데미 과학기술상 수상
  • 영화 VFX의 연기, 불, 구름, 물 시뮬레이션에 표준으로 사용
  • Houdini, Blender, Cinema 4D 등 주요 DCC 도구에 통합

NVIDIA GVDB Voxels:

  • GPU에서의 희소 볼륨 연산, 시뮬레이션, 렌더링을 위한 SDK
  • CUDA 기반으로 OpenVDB의 GPU 대응물
  • 3D 프린팅 최적화(래티스/허니컴 구조 자동 생성), LiDAR 데이터 처리, 유체 시뮬레이션에 활용

NanoVDB:

  • OpenVDB의 경량 GPU 호환 버전
  • 포인터 없는 연속 메모리 레이아웃으로 CUDA, OpenCL, DirectX, CPU 등 다양한 플랫폼 지원
  • GPU 레이 트레이싱, 천(cloth) 시뮬레이션 충돌 감지, 유체 시뮬레이션 경계 조건 등에 최적

💡 참고: OpenVDB, NVIDIA GVDB Voxels, NanoVDB (NVIDIA Developer)

🔹 6.7 AI/딥러닝

3D 데이터의 딥러닝 처리에서 Voxel은 정규 격자(regular grid) 특성 덕분에 기존 CNN 아키텍처를 직접 확장 적용할 수 있는 장점이 있다.

3D Voxel CNN:

  • 3D 볼륨 데이터에 3D 컨볼루션을 적용하는 방식
  • 구현이 직관적이지만 메모리 소비가 해상도의 세제곱으로 증가
  • VoxNet (2015), 3D ShapeNets 등이 대표적

Point-Voxel CNN (PVCNN) (MIT Han Lab, NeurIPS 2019 Spotlight):

  • 포인트와 Voxel의 장점을 결합한 하이브리드 아키텍처
  • 포인트 기반으로 데이터를 저장하여 메모리 소비를 줄이면서, Voxel 기반으로 컨볼루션을 수행하여 메모리 지역성(locality) 확보
  • Voxel 기반 대비 10배 GPU 메모리 절감, 포인트 기반(PointNet) 대비 7배 속도 향상
  • NVIDIA Jetson Nano에서 초당 20개 객체 처리 (PointNet 대비 12배)

PointNet / PointNet++: 포인트 클라우드를 직접 처리하는 네트워크. Voxelization 없이 포인트의 순열 불변성(permutation invariance)을 활용하지만, 불규칙한 메모리 접근으로 80%의 시간이 데이터 구조화에 소모되는 단점.

💡 참고: Point-Voxel CNN for Efficient 3D Deep Learning (MIT Han Lab), PVCNN (arXiv), NVIDIA Jetson - PVCNN Spotlight


⚖️ 7. Voxel vs Mesh vs Point Cloud 비교

⚖️ 7.1 표현 방식별 특성 비교

특성 Voxel Mesh Point Cloud
구조 정규 3D 격자 정점(Vertex), 간선(Edge), 면(Face) 비정형 3D 점 집합
표면 표현 계단 형태 (해상도 의존) 매끄럽고 정밀 이산적 점 (연결 정보 없음)
내부 표현 자연스럽게 지원 별도 처리 필요 불가
메모리 O(N^3), 높음 표면 비례, 효율적 점 수 비례, 가변적
수정 용이성 매우 쉬움 (값 변경) 복잡 (토폴로지 변경) 쉬움 (점 추가/제거)
렌더링 볼륨/레이 기반 래스터라이제이션 포인트 기반/변환 필요
물리 시뮬레이션 자연스러움 어려움 어려움
3D CNN 적용 직관적 어려움 특수 아키텍처 필요
주요 출처 스캐닝, 시뮬레이션, 생성 모델링, 변환 스캐닝, LiDAR

⚠️ 7.2 각 방식의 핵심 장단점

Voxel의 장점:

  • 정규 격자 구조로 공간 인덱싱과 쿼리가 효율적
  • 볼륨 내부 정보를 자연스럽게 포함
  • CSG 연산(합집합, 교집합, 차집합)이 단순
  • 3D CNN에 직접 적용 가능
  • 파괴/변형 시스템 구현이 용이

Voxel의 단점:

  • 고해상도에서 메모리 소비가 급격히 증가 (O(N^3))
  • 얇은 구조물과 미세한 디테일 표현이 어려움
  • 희소 환경에서 빈 공간이 불필요하게 메모리를 소비
  • 계단 현상(aliasing)이 발생

Mesh의 장점:

  • 적은 데이터로 매끄러운 표면을 효율적으로 표현
  • 대부분의 3D 소프트웨어 및 하드웨어와 호환
  • 변형(deformation)과 애니메이션에 유리
  • GPU 래스터라이제이션에 최적화

Mesh의 단점:

  • 복잡한 토폴로지 변경(파괴 등)이 어려움
  • 볼륨 내부 정보를 직접 포함하지 않음
  • 노이즈와 구멍에 민감
  • 변환 시 표면 디테일 손실 가능

Point Cloud의 장점:

  • 3D 스캐닝 장비에서 직접 획득 가능
  • 변환 과정 없이 원본 데이터의 정밀도 유지
  • 유연하고 단순한 구조
  • 대규모 야외 장면에 적합

Point Cloud의 단점:

  • 연결 정보(connectivity)가 없어 직접 시각화가 어려움
  • 고해상도 데이터의 저장 공간이 큼
  • 비정형(unstructured) 데이터로 처리가 복잡

🔹 7.3 상호 변환 방법

    Voxelization          Marching Cubes
Mesh ──────────────> Voxel ──────────────> Mesh
                       ^
                       │ Voxelization
                       │ (Binning)
Point Cloud ───────────┘
       ^
       │ Surface Sampling
       │
      Mesh ─────────────────────────────> Point Cloud
                  정점 추출

상호 변환 알고리즘:
- Mesh -> Voxel: Surface/Solid Voxelization
- Voxel -> Mesh: Marching Cubes, Marching Tetrahedra, Dual Contouring
- Point Cloud -> Voxel: Spatial Binning, TSDF Fusion
- Voxel -> Point Cloud: 표면 Voxel 중심좌표 추출
- Mesh -> Point Cloud: 표면 샘플링 (Poisson Disk 등)
- Point Cloud -> Mesh: Poisson Surface Reconstruction, Ball Pivoting

💡 참고: A Beginner’s Guide to 3D Data (Medium), Voxel vs Points in 3D Deep Learning (Think Autonomous)


🔗 8. 참고 자료 및 출처

🔹 학술 논문 및 리뷰

🔹 기술 문서 및 블로그

🔹 공식 프레임워크 및 도구

🏢 게임 및 응용

🏢 의료 및 산업 응용


리서치 요청
md 파일 생성
백그라운드에서 sub agent 로 진행

3D Voxel?