최신 엔진은 식생 overdraw를 어떻게 이기는가
글 Oleg Sidorkin, Cinevva CTO 겸 공동 창업자

숲은 GPU에게 렌더링을 시킬 수 있는 것 중 가장 까다로운 대상 중 하나다. 잎 하나하나가 alpha 마스크로 잘라낸 텍스처 쿼드다. 그런 쿼드 수십 개가 시선 방향마다 겹겹이 쌓인다. 래스터라이저는 어떤 프래그먼트가 alpha 테스트를 통과할지 미리 알 방법이 없어서, 불투명 장면을 살려주는 표준 early-Z 최적화가 여기서는 대부분 꺼진다. 그 결과 하나의 화면 픽셀이 프레임이 정리되기 전까지 잎 셰이더를 10번이나 15번씩 돌리게 된다. 이게 바로 식생 overdraw다. 지난 10년 동안 출시된 어느 게임에서든 오픈월드 프레임에서 가장 비싼 단일 요소다.
좋은 소식은 이미 해결된 문제라는 점이다. 누군가 트릭 하나로 고쳤다는 뜻이 아니라, 일곱여덟 가지 기법을 묶으면 빽빽한 숲에서의 실효 overdraw를 8-15배에서 1-2배까지 끌어내릴 수 있다는 뜻이다. 모든 최신 엔진은 이 스택의 어떤 버전이든 탑재하고 있다. 그 안에 무엇이 들었는지, 각 조각이 왜 존재하는지, 그리고 각각의 정석 참고 자료를 정리한다.
1. 식생 overdraw가 왜 이렇게 괴로운가
전형적인 불투명 장면에서 GPU는 early depth rejection을 한다. 픽셀 셰이더가 돌기도 전에, 하드웨어가 기존 깊이 버퍼를 확인해서 이미 뒤에 가려진 프래그먼트를 건너뛴다. 이건 사실상 공짜고, 밀집된 지오메트리의 비용을 정상 범위로 유지해주는 핵심이다.
alpha-tested 식생은 이걸 깨뜨린다. 프래그먼트 셰이더가 실제로 돌면서 alpha 텍스처를 평가하고, 마스크로 가려진 픽셀에 discard(또는 clip)를 호출해야 한다. 하드웨어는 셰이더가 돌기 전까지 프래그먼트가 버려질지 알 수 없으므로, 대부분의 GPU에서는 셰이더 어딘가에 discard가 들어가 있으면 그 draw call의 early-Z가 통째로 꺼진다. 타일 기반 GPU(모바일, M 시리즈, 일부 콘솔)에서는 프레임 전체의 Hi-Z와 깊이 압축까지 꺼질 수 있다. 픽셀을 덮는 삼각형마다 픽셀 셰이더가 한 번씩 돌고, 그중 대부분은 discard로 끝난다.
잎 쿼드 10개를 하나의 화면 픽셀 앞에 쌓으면 잎 셰이더가 10번 돈다. 거기에 400만 픽셀을 곱하면 비용이 잔혹해진다. Marco Salvi의 글 To Early-Z, or Not To Early-Z는 이게 하드웨어 수준에서 왜 벌어지는지를 가장 부드럽게 설명한다. 한 번도 생각해본 적 없다면 여기서 시작하는 게 맞다.

2. 마스크 지오메트리를 위한 깊이 prepass
가장 큰 단일 이득이자 모든 최신 엔진이 탑재한 기법은 식생 드로를 두 패스로 쪼개는 것이다. 첫 번째 패스는 깊이만 쓴다. alpha 테스트를 하고, 마스크로 가려진 픽셀을 버리고, 그 외에는 아무것도 쓰지 않는 최소한의 셰이더를 쓴다. 두 번째 패스는 깊이 테스트를 "equal"로 설정하고 깊이 쓰기는 끈 채 완전한 머티리얼을 렌더링한다. 이제 뒤에 잎 쿼드가 몇 장 쌓여 있든, 보이는 픽셀 하나하나는 완전한 BRDF를 정확히 한 번만 셰이딩한다.
같은 삼각형을 두 번 건드리니 두 배 일하는 것처럼 들리지만, prepass 셰이더가 워낙 싸서(텍스처 샘플 한 번, discard 한 번, 깊이 쓰기 한 번) 메인 패스에서 아끼는 비용이 그 추가 부담을 훌쩍 넘는다. 빽빽한 숲에서 메인 패스는 픽셀당 잎 셰이더를 10-15번 돌리던 것에서 정확히 한 번 돌리는 것으로 바뀐다.
Unreal, Frostbite, Decima, 그리고 최신 Rage 및 Dunia 브랜치가 모두 이렇게 한다. 이런 엔진들에서 마스크 머티리얼이 여전히 반투명 머티리얼보다 싼 핵심 이유이기도 하다.
깊이 있게 읽을 자료:
- Pettineo, To Early-Z, or Not To Early-Z (
discard가 Hi-Z 및 early-Z와 어떻게 상호작용하는지에 대한 정석 설명). - Wihlidal, Optimizing the Graphics Pipeline with Compute (GDC 2016, Frostbite의 깊이 prepass와 prepass 구동 컬링 아키텍처).
- Sanders, Between Tech and Art: The Vegetation of Horizon Zero Dawn (GDC 2018, Decima의 두 패스 식생 렌더링).
- Persson, A couple of notes about Z (depth-equal 테스트와 prepass 경제학을 가장 명료하게 설명한 글 중 하나).
3. 공격적인 LOD와 팔면체 임포스터
두 번째로 큰 이득은 그릴 필요가 없을 때 잎을 아예 그리지 않는 것이다. 식생 에셋은 여러 LOD 단계를 함께 담고 출시된다. 가장 가까운 단계는 잎 카드가 각각 들어 있는 완전한 메시다. 중간 거리에서는 잎들이 더 빽빽한 복합 카드로 합쳐진다(잎 30장 한 뭉치가 같은 실루엣을 가진 텍스처 카드 1장이 된다). 어떤 거리 임계값을 넘으면 나무 전체가 임포스터가 된다. 여러 각도에서 사전 렌더링한 나무의 뷰로 텍스처를 입힌 작은 지오메트리 조각이다.
최신 임포스터 포맷은 팔면체 임포스터다. 8개 면으로 된 지오메트리 조각에, 팔면체 매핑으로 구면 위 점들에서 캡처한 뷰들의 아틀라스를 텍스처로 입힌 것이다. 런타임에 셰이더는 카메라 방향에 따라 가장 가까운 사전 렌더링 뷰 두세 개를 고르고 그 사이를 블렌딩한다. 결과는 어느 각도에서 봐도 3D처럼 보이는, 삼각형 몇 개짜리 대역이다. 제대로 된 셰이딩, 노멀 맵, 심지어 바람 애니메이션까지 가질 수 있다. Ryan Brucks의 구현은 처음엔 커뮤니티 플러그인이었다가 이제 Unreal의 일부가 됐고, 이 분야의 참고 구현이다. Microsoft Flight Simulator의 수십억 그루 숲은 카메라 근처를 빼면 본질적으로 어디든 팔면체 임포스터다.
더 큰 구조적 이득은 임포스터가 먼 거리에서 불투명하거나 거의 불투명하다는 점이다. 잎 30장짜리 복합 카드는 쿼드 30장이 아니라 마스크 쿼드 1장이다. 나무 전체 임포스터는 수천 개가 아니라 몇 개의 면이다. 원거리 overdraw가 거의 0으로 줄어든다.
깊이 있게 읽을 자료:
- Brucks, Octahedral Impostors (수학과 UE 구현이 함께 있는 정석 참고 자료).
- Halen, Octahedral Impostors in Unreal Engine (UE에 통합된 워크플로).
- Häggström, Real-Time Rendering of Vegetation (LOD 체인, 임포스터, 그 배후의 수학을 다루는 깔끔한 논문).
- Crytek, SpeedTree integration in CryEngine 3 (GPU Gems 3, 나무 LOD 체인 입문으로는 여전히 최고).
4. 클러스터 및 GPU 구동 컬링
깊이 prepass가 있어도 prepass 자체에는 비용이 있다. 보이는(또는 잠재적으로 보이는) 나무마다 모든 삼각형을 여전히 건드려야 한다. 최신 엔진은 GPU 구동 클러스터 컬링으로 그 비용을 더 낮춘다. 래스터라이저가 보기도 전에 삼각형 무리 전체를 버린다.
파이프라인은 이렇게 생겼다. 모든 메시는 미리 삼각형 64개나 128개 단위의 클러스터로 쪼개지고, 각 클러스터는 꽉 맞는 경계 상자와 노멀 콘을 갖는다. 렌더링 시점에 compute 셰이더가 인스턴스 목록을 훑으며 각 인스턴스에 프러스텀 테스트를 하고, 보이는 인스턴스마다 모든 클러스터에 프러스텀 테스트를 한 다음, 살아남은 클러스터마다 직전 프레임의 깊이 피라미드에 대해 Hi-Z 오클루전 테스트를 한다. 언덕 뒤에 숨었거나 다른 나무 앞에 가려진 나무 가지 전체가 정점 셰이더가 돌기도 전에 컬링된다. 출력은 "이 클러스터들을 그려라"라는 인자들의 압축된 목록이고, 이게 단 한 번의 DrawIndirect 호출로 그대로 들어간다.
나무 1만 그루의 숲이 몇 초가 아니라 몇 밀리초 안에 렌더링되는 이유가 이것이다. Ubisoft의 어쌔신 크리드 유니티 발표가 이 파이프라인을 양산 형태로 처음 소개했고(삼각형 20-40% 컬링, 그림자 삼각형 30-80% 컬링, 화면상 인스턴스 수가 이전 세대 대비 10배), Wihlidal의 Frostbite 발표가 더 멀리 밀어붙였다. UE5 Nanite는 이 궤적의 눈에 보이는 종착점이다. 클러스터 컬링을 픽셀 단위까지 밀어붙인다.
깊이 있게 읽을 자료:
- Haar와 Aaltonen, GPU-Driven Rendering Pipelines (SIGGRAPH 2015, 어쌔신 크리드 유니티의 기초가 된 발표).
- Wihlidal, Optimizing the Graphics Pipeline with Compute (GDC 2016, Frostbite의 GPU 구동 prepass).
- Karis, Stubbe, Wihlidal, A Deep Dive into Nanite Virtualized Geometry (SIGGRAPH 2021, meshlet 단위의 클러스터 컬링).
- Liktor, Geometry Rendering Pipeline Architecture at Activision (콜 오브 듀티 버전의 클러스터 컬링, 2021).
5. 인스턴스와 클러스터의 앞에서 뒤로 정렬
prepass가 제 역할을 하기 시작하면 순서가 중요해진다. prepass는 깊이를 쓰지만 alpha 테스트를 통과한 프래그먼트에 대해서만 쓴다. 숲의 뒤쪽을 먼저 그리고 앞쪽을 나중에 그리면, 앞쪽 프래그먼트마다 뒤쪽 프래그먼트를 덮어쓰게 되고, prepass 셰이더는 뒤쪽을 위해 여전히 돈다. 앞에서 뒤로 그리면 연속된 draw call마다 더 작은 값으로 깊이 버퍼를 더 많이 채우고, Hi-Z는 셰이더가 돌기 전에 뒤쪽 프래그먼트를 점점 더 많이 걸러낸다.
거의 모든 최신 엔진이 prepass를 발행하기 전에 카메라까지의 거리로 식생 인스턴스를 정렬하는 이유가 이것이다. 정렬은 싸고(GPU에서 radix sort로 인스턴스 수십만 개를 한 번에 처리), prepass 자체를 스스로 가지치기하는 작업으로 바꿔준다. 클러스터 단위 컬링도 같은 이유로 meshlet 단위에서 정렬한다. 깊이 prepass와 앞에서 뒤로 순서는 각각이 좋고 조합하면 훌륭한 그런 한 쌍이다.
깊이 있게 읽을 자료:
- Persson, Depth in-depth (깊이 버퍼 순서, prepass 경제학, Hi-Z 동작에 대한 아키텍처 노트).
- Giesen, A trip through the graphics pipeline (Hi-Z 걸러내기 비율이 그리는 순서에 어떻게 의존하는지에 대한 깊은 기술적 설명).
- Wihlidal, Optimizing the Graphics Pipeline with Compute (GDC 2016, Frostbite의 GPU 측 인스턴스 정렬 포함).
6. 디더링 LOD 전환과 hashed alpha
또 다른 큰 함정은 페이드다. 두 LOD 사이를 전환하거나(또는 카메라가 다가올 때 인스턴스를 페이드 인/아웃하는) 가장 순진한 방법은 alpha 블렌딩이다. 하지만 블렌딩된 지오메트리는 깊이 버퍼에 쓸 수 없어서, 페이드 중인 모든 나무를 느린 반투명 경로로 밀어넣고 prepass를 깨뜨린다. 해법은 지오메트리를 마스크 경로에 그대로 두고 alpha 테스트 안에서 페이드를 하는 것이다.
주요 기법 두 가지:
- 디더링 LOD 전환은 4x4 또는 8x8 Bayer 패턴(또는 화면 공간 블루 노이즈 텍스처)을 샘플링해서 픽셀별 컷오프 보정값으로 쓴다. 50% 블렌드 상태의 나무는 체커보드 형태로 픽셀이 살아남고, 빠진 픽셀은 다음 LOD의 상보적 체커보드가 채운다. TAA가 두세 프레임에 걸쳐 체커를 매끄러운 블렌드로 정리한다. 싸고, 안정적이고, 엔진의 다른 모든 것과 잘 어울린다.
- Hashed alpha testing (Wyman & McGuire, I3D 2017)은 고정된 0.5 alpha 임계값을 픽셀별 [0,1) 해시 임계값으로 바꾼다. 보통은 완전히 사라질 먼 거리 alpha 지오메트리(밉맵된 alpha가 0.5 아래로 떨어지기 때문)가 안정적으로 흩어진 채 살아남는 픽셀들을 유지한다. 여기서도 TAA가 정리를 맡는다.
두 기법 모두 식생을 깊이 prepass가 작동하는 불투명/마스크 경로에 유지하므로, 뭔가를 페이드 인하려고 반투명 렌더링 비용 전체를 치르지 않아도 된다. Alpha to coverage는 같은 아이디어의 MSAA 시대 사촌뻘이다. alpha를 서브픽셀 커버리지 마스크로 바꿔서, 마스크 경로를 떠나지 않고도 부분 투명을 얻는다. 함정은 A2C가 MSAA에서만 진가를 발휘한다는 점인데, 요즘 대부분의 최신 디퍼드 렌더러는 MSAA를 더 이상 쓰지 않는다.
깊이 있게 읽을 자료:
- Wyman과 McGuire, Hashed Alpha Testing (I3D 2017, hashed alpha의 정석 논문).
- Castaño, Computing Alpha Mipmaps (The Witness 블로그, 먼 거리의 나무가 사라지지 않도록 alpha-tested 텍스처를 밉맵하는 올바른 방법).
- Yuksel, Alpha Distribution for Alpha Testing (alpha 밉맵에 대한 더 최근의 개선).
- NVIDIA, Anti-Aliased Alpha Testing (A2C, hashed alpha, 디더링 대안에 대한 개관).
7. 마스크 픽셀의 셰이딩 비용 줄이기
완벽한 prepass와 완벽한 컬링이 있어도, 보이는 식생 픽셀마다 한 번은 셰이딩해야 한다. 엔진은 그 비용도 줄인다:
- 더 싼 BRDF. 식생은 무광이라 완전한 Cook-Torrance 스페큘러 경로가 사실 필요 없다. wrapped-Lambertian 디퓨즈에 한 줄짜리 스페큘러 근사면 충분하다.
- 저주파 노멀 맵. 잎은 이미 어수선하다. 보통 보는 거리에서는 256x256 노멀 맵이 1024x1024와 똑같아 보이고, 대역폭도 아낀다.
- 패럴랙스 없음, 이방성 없음, 클리어코트 없음. 잎에서는 PBR 기능 메뉴를 다 끈다.
- 완전한 서브서피스 산란 대신 양면 박막 투과. 잎은 뒤에서 빛을 투과시키는데, 역광 내적 하나로 흉내 낼 수 있다.
- 일부 엔진의 절반 해상도 셰이딩. 식생은 1/4 또는 1/2 픽셀 레이트로 셰이딩한 뒤 업스케일한다. TAA의 확률적 노이즈가 리샘플링을 가려준다.
- 마스크 머티리얼에서는 기본적으로 디테일 텍스처와 데칼 생략.
각각은 개별로 보면 작은 이득이다. 조합하면 마스크 식생 셰이더는 동등한 불투명 머티리얼보다 2-3배 빠르게 돌 수 있다.
깊이 있게 읽을 자료:
- Lagarde와 de Rousiers, Moving Frostbite to Physically Based Rendering 3.0, 식생과 투과에 관한 절 (SIGGRAPH 2014, 박막 양면 머티리얼을 위한 정석 PBR 조정).
- Jimenez, Next Generation Character Rendering (wrapped-Lambertian과 역광 투과 수학. 원래는 피부용이지만 잎으로 널리 이식됐다).
- Sanders, Between Tech and Art: The Vegetation of Horizon Zero Dawn (GDC 2018, Decima의 식생 셰이더 단순화).
8. 가시성 버퍼와 마스크 머티리얼을 위한 Nanite
overdraw에 대한 가장 깔끔한 답은 셰이딩을 래스터화에서 완전히 분리하는 것이다. 가시성 버퍼는 지오메트리를 얇은 버퍼(픽셀당 삼각형 ID와 인스턴스 ID만)로 래스터화한 다음, 그 가시성 버퍼를 읽어 픽셀마다 정확히 한 번 셰이딩하는 디퍼드 패스로 완전한 머티리얼을 돌린다. 구조상 셰이딩 단계에는 overdraw가 없다. Burns와 Hunt의 2013년 논문이 이 아이디어를 소개했고, UE5 Nanite는 그 양산 품질 구현이다. UE 5.5부터는 마스크 식생도 포함한다.
Nanite의 묘수는 이걸 클러스터 단위 가상화 지오메트리로 한다는 점이다. 그래서 래스터라이저 자체가 서브픽셀 삼각형에 대해 소프트웨어 경로로 돌면서 overdraw를 유계로 유지한다. Nanite의 마스크 머티리얼은 "programmable raster" 기능이 필요하다. alpha 테스트는 가시성 버퍼 패스 동안 돌지만, 머티리얼 셰이딩은 여전히 디퍼드 리졸브에서 보이는 픽셀마다 한 번씩 일어난다. 그 결과, 한때 마스크 머티리얼에서 느리기로 악명 높던 아주 빽빽한 Nanite 식생이 이제 불투명 머티리얼과 견줄 만하거나 오히려 더 싸졌다. 셰이딩 시점의 overdraw가 0이기 때문이다. 절충점이 하나 있다. 마스크 경로가 programmable-raster 비용을 더하기 때문에, 저폴리 마스크 카드 나무를 유지하기보다 고폴리 불투명 나무 지오메트리를 Nanite로 밀어넣는 게 나을 때가 많다.
깊이 있게 읽을 자료:
- Burns와 Hunt, The Visibility Buffer: A Cache-Friendly Approach to Deferred Shading (JCGT 2013, 원조 논문).
- Karis, Stubbe, Wihlidal, A Deep Dive into Nanite Virtualized Geometry (SIGGRAPH 2021, 양산 아키텍처).
- Epic, Nanite GPU Driven Materials (GDC 2024, 마스크 머티리얼과 programmable-raster 파이프라인 포함).
- Notes from "Nanite GPU Driven Materials" (같은 발표를 깔끔하게 정리한 제3자 정리).
9. 식생을 위한 별도의 그림자 표현
alpha-tested 식생의 그림자 맵은 어느 오픈월드 프레임에서든 큰 캐스케이드 다음으로 두 번째로 비싼 그림자 문제다. 캐스케이드마다 자기만의 깊이 prepass가 필요하고, prepass마다 alpha 테스트를 돌리며, 그 비용이 캐스케이드 4개와 광원 프러스텀 수십 개를 거치며 빠르게 쌓인다. 그래서 대부분의 엔진은 식생 색을 렌더링하는 것과 같은 방식으로 식생 그림자를 렌더링하지 않는다.
흔한 대체 방식:
- 메시 거리장 그림자 (UE Lumen, 자체 엔진). 각 메시는 미리 계산된 signed distance field를 갖는다. SDF를 짧게 콘 트레이스하면 alpha-tested 메시를 전혀 건드리지 않고도 부드러운 그림자를 얻는다. 나무에 특히 좋다. SDF가 나뭇잎 하나하나의 디테일은 무시하고 수관 실루엣을 하나의 단단한 덩어리로 포착하기 때문이다.
- 식생용 저해상도 캐스케이드. 식생 그림자는 절반 해상도 슬라이스로 들어가고 엣지 인식 필터링으로 업샘플링된다. 그림자가 이미 부드러워서 눈은 해상도 저하를 알아차리지 못한다.
- MSAA를 곁들인 alpha-to-coverage 그림자 맵. 그림자 경로에 아직 MSAA가 있는 엔진에서는 A2C가 완전한 alpha 테스트 비용 없이 가장자리가 부드러운 식생 그림자를 만든다.
- 줄기와 큰 가지에는 캡슐 그림자, 수관에는 거리장, 완전한 alpha 테스트는 가장 가까운 캐스케이드에서만. 거리에 따라 다른 표현을 쓰고 라이팅 패스에서 블렌딩한다.
- WPO 비활성화 거리. 바람으로 구동되는 World Position Offset이 임계값을 넘으면 꺼져서, 캐싱된 그림자 데이터가 프레임 간에 유효하게 유지된다. UE의 Virtual Shadow Maps가 이걸 크게 활용한다.
깊이 있게 읽을 자료:
- Epic, Distance Field Soft Shadows in Unreal Engine (메시 DF 그림자에 대한 정석 UE 참고 자료).
- Wright, Lumen: Real-Time Global Illumination in Unreal Engine 5 (SIGGRAPH 2022, Lumen의 식생용 메시 SDF 통합).
- Epic, Virtual Shadow Maps (최신 UE5 그림자 아키텍처, 식생 전용 WPO 비활성화 및 캐싱 규칙 포함).
- Persson, Practical Cascaded Shadow Maps (alpha-tested 캐스터에 대한 노트를 담은, 여전히 정석인 CSM 참고 자료).
10. 바람, 애니메이션, 그림자 캐싱
미묘하게 연관된 문제가 하나 있다. 대부분의 식생은 움직인다. 바람으로 구동되는 정점 애니메이션(UE의 World Position Offset, Frostbite와 Decima의 대응 기능)은 식생 지오메트리가 프레임 간에 안정적이지 않다는 뜻이고, 이건 그림자 캐싱과 리프로젝션을 깨뜨린다. 최신 엔진은 두 가지 방식으로 이에 맞선다:
- 거리에서 WPO 제한. 임계값을 넘으면 바람 애니메이션 진폭이 매끄럽게 0으로 간다. 그 정도 멀어지면 어차피 눈으로 흔들림을 볼 수 없고, 그림자 캐시는 유효하게 유지된다.
- 바람을 클러스터 경계에 굽기. 클러스터 경계 상자를 최대 WPO 오프셋만큼 부풀려서, 프레임마다 다시 업로드하지 않고도 컬링이 보수적으로 유지되게 한다.
- 인스턴스별 위상 오프셋. 똑같은 나무들이 인스턴스별 랜덤 시드로 바람 위상을 어긋나게 해서, 나무마다 고유 애니메이션을 치르지 않으면서도 숲이 일사불란하게 흔들리지 않게 한다.
이런 종류의 디테일은 기법 목록에는 안 나오지만, 실전에서 3 ms 숲과 9 ms 숲을 가르는 차이다.
깊이 있게 읽을 자료:
- Sanders, Between Tech and Art: The Vegetation of Horizon Zero Dawn (GDC 2018, Decima의 바람 애니메이션 파이프라인과 그림자 캐싱).
- McAuley, Rendering the World of Far Cry 4 (GDC 2015, 식생을 위한 바람 그리드 샘플링 포함).
- Epic, Foliage and Virtual Shadow Maps (WPO 비활성화 거리와 VSM 캐싱에 대한 UE5 커뮤니티 안내).
11. 합쳐서 따져보는 계산
이 트릭들 중 어느 하나도 만능 해결책은 아니다. 흥미로운 건 이걸 쌓았을 때 무슨 일이 벌어지는가다:
- 빽빽한 숲 장면에서 순진한 마스크 식생 패스는 실효 overdraw가 8-15배로 측정된다. 보이는 픽셀마다 잎 셰이더를 8번에서 15번 돌린다.
- 깊이 prepass를 더하면 메인 패스의 overdraw가 ~1배로 떨어지지만, prepass 자체는 여전히 모든 걸 건드린다.
- 앞에서 뒤로 정렬을 더하면 prepass가 스스로 가지치기를 시작한다.
- 클러스터 단위 GPU 컬링을 더하면 prepass는 보일 가능성이 있는 것만 건드린다.
- LOD 체인과 임포스터를 더하면 30 m 너머에서 보이는 쿼드의 개수가 한 자릿수 차수만큼 떨어진다.
- 가시성 버퍼 / Nanite 경로를 더하면 빽빽하게 겹쳐도 셰이딩 단계가 진정 픽셀당 한 번만 돈다.
- 거리장 그림자를 더하면 그림자 비용이 더 이상 alpha 테스트에 비례해 늘지 않는다.
위에 링크한 발표들에서 반복되는 핵심 결론은 이렇다. 실효 overdraw가 8-15배에서 1-2배로 무너지고, 빽빽한 숲 장면에서 전체 식생 프레임 비용이 4-6배 떨어진다. 최신 오픈월드 게임이 소비자용 하드웨어에서 숲을 60+ fps로 렌더링할 수 있는 이유가 통째로 이것이다.

12. 이것이 브라우저에 갖는 의미
이 스택의 대부분은 WebGPU에 깔끔하게 매핑된다. 우리는 이미 오픈월드 브라우저 엔진에서 GPU 구동 컬링, 간접 디스패치, Hi-Z 오클루전, 앞에서 뒤로 정렬한 prepass를 출시했다. 마스크 지오메트리를 위한 깊이 prepass는 간단하다. WebGPU는 depth-equal 테스트와 프래그먼트 셰이더의 discard를 지원하고, early-Z에 관한 주의사항도 똑같다. 팔면체 임포스터는 기계적으로 이식된다. 수학은 그저 구면에서 팔면체로의 펼침과 아틀라스 인덱싱일 뿐이다.
더 어려운 건 최신 기법들이다. WebGPU의 가시성 버퍼는 32비트 삼각형 ID를 렌더 타깃에 쓰고 풀스크린 compute 패스에서 머티리얼을 리졸브하는 것을 뜻한다. 구성 요소는 다 있지만 조율이 까다롭다. 메시 거리장 그림자는 에셋당 3D 텍스처 하나와 짧은 콘 트레이스를 원하는데, 둘 다 WebGPU의 사정거리 안에 있다. Hashed alpha와 디더링 LOD는 각각 셰이더 함수 하나면 된다.
브라우저 식생이 나아갈 길은 이 스택의 다른 모든 것과 같다. 싸고 견고한 부품(prepass, 정렬된 인스턴스, LOD, 임포스터, hashed alpha)을 먼저 출시하고, 그 위에 무거운 기계장치(가시성 버퍼, 메시 SDF 그림자)를 얹는다. 브라우저 하드웨어 하한선이 마침내 충분히 높아져서, WebGPU 숲이 콘솔 숲처럼 보이고 돌지 못할 구조적 이유는 없다. 그저 엔지니어링상의 이유만 있을 뿐이고, 엔지니어링상의 이유는 우리가 좋아하는 종류다.
스택 전체에 걸친 더 읽을거리
이 모든 걸 하나로 엮은 자료를 원한다면, SIGGRAPH "Advances in Real-Time Rendering in Games" 아카이브(advances.realtimerendering.com)에 2014년까지 거슬러 올라가는 식생과 GPU 구동 렌더링의 정석 발표들이 있다. Adrian Courrèges의 GPU 프로파일링 글들에는 GTA V와 Horizon Zero Dawn의 프레임별 분석이 있어서, 여기서 다룬 모든 패스를 양산 순서대로 보여준다. alpha 테스트 수학 자체로는 Chris Wyman의 연구 페이지에 hashed alpha와 확률적 투명 논문이 참조 셰이더와 함께 있다. 그리고 Real-Time Rendering, 4th edition의 투명, 샘플링, 깊이 처리 장은 여전히 교과서적 출발점이다.