Visibility Buffer
64-bit 구조와 Deferred Materials 시스템을 이해합니다
Visibility Buffer란?
G-Buffer의 경량 대안
Visibility Buffer는 각 픽셀에 어떤 삼각형이 보이는지만 기록하는 최소한의 버퍼입니다. 기존 G-Buffer가 머티리얼 속성(노멀, 색상, 러프니스 등)을 모두 저장하는 것과 달리, Visibility Buffer는 삼각형 ID만 저장합니다.
Visibility Buffer는 "무엇이 보이는지"만 결정하고, "어떻게 보이는지"(머티리얼)는 나중에 한 번만 평가합니다. 이로 인해 오버드로우 비용이 사실상 0이 됩니다.
64-bit 구조
깊이와 식별자를 하나의 값으로
// 64-bit Visibility Buffer 구조
struct VisibilityBuffer {
uint32 Depth; // 상위 32비트: Z 깊이
uint32 TriangleID : 24; // 하위 24비트: 삼각형 ID
uint32 ClusterID : 8; // 하위 8비트: 클러스터 ID
};
// Atomic Max 연산으로 Z-Test + 기록 동시 수행
InterlockedMax(VisBuffer[pixel], PackedValue);
Depth를 상위 비트에 배치함으로써 InterlockedMax 연산이 자동으로 Z-Test 역할을 수행합니다. 가장 가까운(큰 Depth 값) 삼각형이 자연스럽게 승리합니다.
G-Buffer와의 비교
대역폭과 오버드로우 관점
| 항목 | 기존 Deferred (G-Buffer) | Visibility Buffer |
|---|---|---|
| 픽셀당 대역폭 | 128+ bits (다중 RT) | 64 bits |
| 오버드로우 비용 | 높음 (각 픽셀 머티리얼 평가) | 없음 (ID만 기록) |
| 머티리얼 평가 시점 | 래스터화 시 (선행) | 최종 픽셀에서만 (지연) |
| 작은 삼각형 효율 | 낮음 (Quad 낭비) | 높음 (SW 래스터) |
Deferred Materials
가시 픽셀에서만 머티리얼 평가
Visibility Buffer가 완성되면, Deferred Materials 패스에서 실제로 보이는 픽셀에 대해서만 머티리얼을 평가합니다.
// Deferred Materials 패스 (개념적)
for each pixel:
triangleID = VisibilityBuffer[pixel].TriangleID
clusterID = VisibilityBuffer[pixel].ClusterID
// 삼각형 데이터 페치
vertices = FetchVertices(clusterID, triangleID)
// 바리센트릭 좌표 계산
barycentrics = ComputeBarycentrics(pixel, vertices)
// 머티리얼 평가 (한 번만!)
materialOutput = EvaluateMaterial(vertices, barycentrics)
// G-Buffer 출력
GBuffer[pixel] = materialOutput
오버드로우가 아무리 많아도 각 픽셀의 머티리얼은 정확히 한 번만 평가됩니다. 복잡한 머티리얼일수록 이 최적화의 효과가 커집니다.
프로파일링
Visibility Buffer 성능 확인
// Nanite 통계 표시
NaniteStats
// GPU 프로파일링
ProfileGPU
// Visibility Buffer 관련 타이밍 확인
// - NaniteRasterize: 래스터화 시간
// - NaniteBasePass: Deferred Materials 시간
- NaniteRasterize - Visibility Buffer 생성 시간
- NaniteBasePass - Deferred Materials 평가 시간
- Visible Clusters - 가시 클러스터 수
- Visible Triangles - 가시 삼각형 수
핵심 요약
- Visibility Buffer는 픽셀당 64-bit로 삼각형 ID와 깊이만 저장
- Atomic Max로 Z-Test와 기록을 동시에 수행 (락 프리)
- 오버드로우 비용 0 - ID 기록만 하고 머티리얼 평가는 지연
- Deferred Materials에서 최종 가시 픽셀만 머티리얼 평가
- 대역폭 절감 - G-Buffer 대비 약 2배 이상 효율적
도전 과제
배운 내용을 직접 실습해보세요
ProfileGPU를 실행하고 NaniteRasterize(Visibility Buffer 생성)와 NaniteBasePass(Deferred Materials 평가) 타이밍을 확인하세요. 복잡한 머티리얼과 단순 머티리얼 메시에서 각각의 비용 차이를 비교하세요.
겹치는 반투명 오브젝트가 많은 씬을 구성하고, Nanite(Visibility Buffer)와 Non-Nanite(기존 G-Buffer)에서의 머티리얼 평가 비용을 ProfileGPU로 비교하세요. 오버드로우 비용 제거 효과를 수치로 확인하세요.
RenderDoc을 사용하여 Visibility Buffer의 실제 64-bit 데이터를 캡처하고, 특정 픽셀의 Depth, Triangle ID, Cluster ID 값을 직접 디코딩해보세요. Atomic Max 연산이 어떻게 Z-Test를 수행하는지 프레임 캡처에서 검증하세요.