PART 1 - 강의 4/4

Visibility Buffer

64-bit 구조와 Deferred Materials 시스템을 이해합니다

01

Visibility Buffer란?

G-Buffer의 경량 대안

Visibility Buffer는 각 픽셀에 어떤 삼각형이 보이는지만 기록하는 최소한의 버퍼입니다. 기존 G-Buffer가 머티리얼 속성(노멀, 색상, 러프니스 등)을 모두 저장하는 것과 달리, Visibility Buffer는 삼각형 ID만 저장합니다.

64
bits per pixel
0
Overdraw Cost
핵심 개념

Visibility Buffer는 "무엇이 보이는지"만 결정하고, "어떻게 보이는지"(머티리얼)는 나중에 한 번만 평가합니다. 이로 인해 오버드로우 비용이 사실상 0이 됩니다.

02

64-bit 구조

깊이와 식별자를 하나의 값으로

C++ // 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);
Packed Value 구조
|<-- 32 bits -->|<-- 24 bits -->|<-- 8 bits -->| +---------------+---------------+--------------+ | Depth | Triangle ID | Cluster ID | +---------------+---------------+--------------+ ^ ^ ^ | | | Z-Test용 삼각형 식별 클러스터 식별
Atomic Max의 영리함

Depth를 상위 비트에 배치함으로써 InterlockedMax 연산이 자동으로 Z-Test 역할을 수행합니다. 가장 가까운(큰 Depth 값) 삼각형이 자연스럽게 승리합니다.

03

G-Buffer와의 비교

대역폭과 오버드로우 관점

항목 기존 Deferred (G-Buffer) Visibility Buffer
픽셀당 대역폭 128+ bits (다중 RT) 64 bits
오버드로우 비용 높음 (각 픽셀 머티리얼 평가) 없음 (ID만 기록)
머티리얼 평가 시점 래스터화 시 (선행) 최종 픽셀에서만 (지연)
작은 삼각형 효율 낮음 (Quad 낭비) 높음 (SW 래스터)
렌더링 흐름 비교
기존 Deferred: Rasterize -> Material Eval -> G-Buffer -> Lighting (오버드로우마다 머티리얼 평가) Visibility Buffer: Rasterize -> Vis Buffer -> [Resolve] -> Material Eval -> Lighting (ID만 기록) (최종 픽셀만 평가)
04

Deferred Materials

가시 픽셀에서만 머티리얼 평가

Visibility Buffer가 완성되면, Deferred Materials 패스에서 실제로 보이는 픽셀에 대해서만 머티리얼을 평가합니다.

Deferred Materials 파이프라인
Vis Buffer -> Triangle ID 추출 -> 버텍스 데이터 페치 -> 머티리얼 평가 -> G-Buffer 출력
개념적 셰이더 흐름 // 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
핵심 이점

오버드로우가 아무리 많아도 각 픽셀의 머티리얼은 정확히 한 번만 평가됩니다. 복잡한 머티리얼일수록 이 최적화의 효과가 커집니다.

05

프로파일링

Visibility Buffer 성능 확인

프로파일링 명령 // Nanite 통계 표시 NaniteStats // GPU 프로파일링 ProfileGPU // Visibility Buffer 관련 타이밍 확인 // - NaniteRasterize: 래스터화 시간 // - NaniteBasePass: Deferred Materials 시간
주요 프로파일링 지표
  • NaniteRasterize - Visibility Buffer 생성 시간
  • NaniteBasePass - Deferred Materials 평가 시간
  • Visible Clusters - 가시 클러스터 수
  • Visible Triangles - 가시 삼각형 수
SUMMARY

핵심 요약

  • Visibility Buffer는 픽셀당 64-bit로 삼각형 ID와 깊이만 저장
  • Atomic Max로 Z-Test와 기록을 동시에 수행 (락 프리)
  • 오버드로우 비용 0 - ID 기록만 하고 머티리얼 평가는 지연
  • Deferred Materials에서 최종 가시 픽셀만 머티리얼 평가
  • 대역폭 절감 - G-Buffer 대비 약 2배 이상 효율적
PRACTICE

도전 과제

배운 내용을 직접 실습해보세요

실습 1: Visibility Buffer 프로파일링

ProfileGPU를 실행하고 NaniteRasterize(Visibility Buffer 생성)와 NaniteBasePass(Deferred Materials 평가) 타이밍을 확인하세요. 복잡한 머티리얼과 단순 머티리얼 메시에서 각각의 비용 차이를 비교하세요.

실습 2: 오버드로우 비교

겹치는 반투명 오브젝트가 많은 씬을 구성하고, Nanite(Visibility Buffer)와 Non-Nanite(기존 G-Buffer)에서의 머티리얼 평가 비용을 ProfileGPU로 비교하세요. 오버드로우 비용 제거 효과를 수치로 확인하세요.

심화 과제

RenderDoc을 사용하여 Visibility Buffer의 실제 64-bit 데이터를 캡처하고, 특정 픽셀의 Depth, Triangle ID, Cluster ID 값을 직접 디코딩해보세요. Atomic Max 연산이 어떻게 Z-Test를 수행하는지 프레임 캡처에서 검증하세요.