7. 문제점
• 화면에 렌더링되지 않아도 되는 면(Culling)
도 셰이딩 연산을 해야만 한다.
• 라이트 증가에 따른 계산의 복잡성이 증가
• 다른 라이트 종류 (directional, spot, point …)
• 오브젝트가 영향 받는 “light list”를 찾아야…
• 라이트 개수/종류에 따른 “Shader Explosion”
• 한 번에 계산할 수 있는 라이트 수의 한계 (셰이더 상수)
9. Deferred Rendering
• 모든 Occlusion이 해결된 후에 Shading을 수행하
는 렌더링 파이프라인을 재구성해보자!
– 각 픽셀에서 보이는 surface geometry에 대한
정보를 출력 (a.k.a “g-buffer”)
– Shading은 모든 geometry 처리가 끝날 때까지
지연되어, 실제 화면에 보이는 면(Pixel)에 대해
서만 G-Buffer를 참조하여 처리 된다
– 셰이딩과 지오메트리 렌더링의 분리
10. Pipeline
Pass 1 : Geometry Pass
– G-Buffer에 화면에 보이는 Geometry 정보를
기록
Pass 2 : Shading Pass
– 화면 공간에서 G-Buffer를 샘플링해서 셰이딩
을 계산한다.
11. G-Buffer
• 셰이딩에 필요한 모든 Geometry의 정보를
버퍼(Multiple Render Target)에 기록한다.
– Position, Normal
– Specular Information
– Albedo
– Etc...
13. G-Buffer
• G-Buffer의 효율적으로 관리가 중요!
– DX9 : 최대 4장, DX11 : 최대 8장
– Normal Encording (XYZ -> XY)
– Position Restruction (Depth -> Position)
– Bit Packing (16bit Channel -> 8bit<<8bit)
15. 문제점
MSAA
– 2D 스크린 상에서 처리되기 때문에 MSAA 지원 불가
– Screen Space Anti Aliasing …
Transparency
– 반투명 불가능
– 별도의 포워드 렌더링으로 처리
MRT
– 제한된 Shading 모델 (G-Buffer의 한계)
– 많은 양의 Memory 사용
– High Bandwidth cost (각 라이트 계산 시, G-Buffer를 Reload)
19. Light Pre-Pass Rendering
• Forward Rendering
Render opaque Geometry sorted front-to-back
하기 전에 Lighting을
Normals
Depth Color
Specular Power
Blit Lights into Light Buffer (sorted front-to-back) 미리 계산!
Light Buffer • 제한적 Material과 많
Render opaque Geometry sorted front-to-back 은 메모리 사용에 대한
해결
or
Blit ambient term and other lighting terms into final image
Frame Buffer
[Siggraph09] The Light Pre Pass Renderer
20. Pipeline
Pass 1 : Geometry Pass
– Normal과 Depth 만 기록
Pass 2 : Lighting Pass
– Light 계산을 통하여, Light Property들을 기록
• Ex) Diffuse : Sum(dot(N, Li))
Pass 3 : Geometry Pass (Shading)
– Lighting Pass의 결과을, Forward Rendering의 셰이딩
할 때 적용
• Ex) Color = Albedo * GetDiffuseLit(screenPixelPos)
21. Light Pre-Pass Rendering
• 기본적으로 Forward Rendering!
• Material 사용에 제한이 없다.
• Geometry Pass를 두 번 렌더링!
• Draw Call이 2배로 늘어난다!
• 최적화하기 위한 방안들이 필요!
• Bandwidth를 줄이지는 못한다.
• 각 라이팅 계산에 대해서, G-Buffer reload
25. Light Indexed Deferred
Rendering
• 각 light의 인덱스를 할당하고,
Pixel마다 인덱스를 저장
• Pipeline
– Depth만 렌더링
– Lighting Pass
• Light Index Texture에 Light Volume
을 렌더링
• RGBA 채널 당 1개의 Light Index 할당
– Geometry Pass
• Light Index Buffer를 가지고, Lighting
http://code.google.com/p/lightindexed-deferredrender/
26. Inferred Rendering
• 반투명 처리가 가능하다.
• Pipeline
– Light Pre Pass의 확장 개념
– G-Buffer Pass
• Normal, Depth, ObjectID
• 낮은 해상도로 렌더링
– Lighting Pass
• 낮은 해상도로 렌더링
– Geometry Pass
• DSF Filter를 사용해서 Upsampling
http://www.slideshare.net/guardin/inferred-lighting-3001875
27. Call Of Duty : Black Ops
• Forward Rendering 선택!
– Performance를 최우선!! (60 FPS 목표!)
• Deferred Rendering은 60FPS에 부적합!
– “하나의 주 라이트+ Based Lights”
• Lights Maps, Environment Probes, …
– “Microfacet BRDF” 사용
• 라이팅을 위해 더 많은 Material Property가 필요
http://advances.realtimerendering.com/s2011/index.html
34. Light Culling
• Lighting 계산은 Screen-Space에서 처리되기
때문에, 각 라이트에 대해서 라이팅 범위
(Pixel)을 최소화 해야 함.
– Light Region Scissors Test
– Light Volume
• Stencil Test
• Z Tests
– Tile Based Light Culling
35. Light Culling
• Scissors Test
– 라이트에 의해 영향을 받는 Screen-Space
Region을 계산하여, Scissor Test로 불필요한
Pixel 연산을 제외시킨다
– Masking과 비슷
40. Light Volume Z tests
• 단순히 Z Test만을 이용해서, (Stencil보다는
덜 정교하지만) Shading 되는 부분을 얻는다.
• Light Volume 뒷면을 그린다면, D3DCMP_GREATER
– 라이트가 “공중에 떠 있는” 부분을 제거
• Light Volume의 앞면을 그린다면, D3DCMP_LESS
– “지면 아래에 묻히는” 라이트 지역을 제거
• Batching이 가능하기 때문에, Light Volume
Rendering에 대한 부담이 조금을 줄어든다.
43. Tile Based Deferred Rendering
or Shading
Tile Based Deferred Rendering
– 렌더링할 화면을 여러 타일로 분할하여 타일 단위로
Rasterization 수행
• PowerVR SGX (iPhone, iPad)
– Memory 접근을 아주 효율적으로 할 수 있다.
– Framebuffer내의 pixel값을 더 효율적으로 Caching 할 수
있다.
Tile Based Deferred Shading
– Tile Based Deferred Rendering과 구분없이 사용하지만, 엄
밀히 말하면, Shading에 대해서만, Tile 단위로 처리를 하
는 방식이기 때문에, Tile Based Shading이라고 해야 한다!
44. Tile Based Deferred Shading
• Screen Space의 Overhead
를 분산시키는 것이 목표!
• 장면을 고정된 크기의 타일로
나누고, 타일에서 영향을 받는
라이트만 계산
• G-Buffer를 한번만 읽으면 모
든 라이트를 계산할 수 있다.
[GDC08] The Technology of Uncharted : Drake’s Fortune
46. Tile Based Deferred Shading
• Pipeline
– G-Buffer Pass
• G-Buffer는 동일하게 렌더링한다.
– Light Culling & Shading Pass
• G-Buffer를 읽어온다.
• 장면을 고정된 크기의 타일로 나누고, 각 타일과 교차하는
light source를 결정한다.
– 각 타일에 대한 Frustum을 가지고, 라이트 Culling
– 각 타일에 보이는 라이트의 인덱스 리스트 저장
• 각 타일 pixel에 대해, 보이는 light source들로 Lighting!
– 각 타일에 대해 라이트의 인덱스 리스트를 이용해서, 라이트 정보
를 읽어온다.
• Lighting 결과와 Shading Albedo 조합
47. Tile Based Light Culling
• Compute Shader의 도입!
• Compute Shader가 2D Thread
Group을 가지고 처리할 수 있도록
Screen Space Tile로 구분한다면, 싱
글 패스에서 모든 처리가능!
• 타일 당 Thread Group, 픽셀 당
Thread 할당
48. Tile Based Light Culling
[Siggraph2010] Deferred Rendering for Current and Future Rendering Pipelines
49. Tile Based Deferred Shading
• 장점
– Bandwidth Cost를 줄일 수 있다.
• G-Buffer Read Once
– Screen Space Lighting Accumulation Overhead를 줄인다.
• 단점
– 일반적으로 아주 많은 수의 라이트에 적합하다고 알려짐
• 적은 수의 라이트 소스에 대해서는 Culling Overhead가 발생…
• 차세대 콘솔이나 GPU와 같이 높은 계산 능력과
Bandwidth의 비율을 가지는 디바이스에 사용하기 효
율적이다.
50. Tile Based Deferred Shading
• GPU를 봤을 때, 메모리 대역폭(Memory
Bandwidth)보다 연산 능력
(Computation Power)의 증가가
더 두드러지는 경향을 보인다!
– Compute Shader기반의
Tile Based Light Culling에 주목!!!
51. Must be Deferred?
점점 더 복잡한 셰이딩 모델을 요구!
– Physically Based Lighting
• Microfacet BRDF, Anisotropic, Oren-Nayer, …
– G-Buffer의 한계
DirectX11
– Compute Shader, UAV등의 사용으로, 직접 연
산이 빠르게 가능해졌음!
52. Tile Based Forward Shading
• “Light Pre Pass Rendering”과 유사
– Shading은 Forward Rendering 위치에서 처리
• G-Buffer가 필요없다.
• Material에 대해 제한이 없다.
• Shading 하기 위해서 한번 더 각 pixel들을 그려줘야
한다.
• Tile Based Light Culling 방식
– Per Tile / Light Culling with Compute Shader
54. Forward +
• Forward + Light Culling
• Light Culling
– Tile Based Light Culling과 동일
– 결과는 Tile당 Light Index List 저
장
• Forward Shading
– Material 정보를 바로 적용
– Light Culling에서 계산된 Tile에
서 Light Index List를 얻어,
Shading을 계산
55. Clustered Shading
“Cluster”
– Tile Based Shading의 각 타일은 min/max Z 값을
가지고, sub frustum을 만든다. 하지만, 카메라 시
점에 따라, depth bound 영향으로 성능과 강한
의존성을 가지게 된다.
– 고정된 3차원 영역으로 장면을 나누어, 뷰에 의존
해서 성능이 감소할 경우는 없다!
– 고정된 3D 영역을 “Cluster”라고 한다.
56. Clustered Shading
Pipeline
– G-Buffer에 장면 렌더링
– Cluster Assignment
• Cluster 마다 Cluster Key를 부여
– Finding Unique Clusters
• Unique Cluster를 찾기 위해서 Key Buffer를 Sorting하고 Compacting!
– Light Assignment
• 각 Cluster에 영향을 주는 Light들의 리스트를 계산
• Cluster는 Bounding Volume으로 표현
• 다수의 라이트 vs 다수의 Cluster 는 Spatial Tree가 필요!
– Shading
• 각 샘플은 미리 계산된 Cluster Key를 사용하여 Cluster Index를 읽어올
수 있다. Cluster Index를 이용해서, Cluster의 라이팅 정보를 읽어온다.
58. 정리
• 효율적인 Dynamic Multiple Lighting에 대
한 기술의 발전!
• 기본적으로 Deferred 방식 출발
• 더 빠르고 많은 Lighting 처리 요구
• 더 복잡한 Shading 처리에 대한 요구
• Low Bandwidth Cost, High Computation으로 발전!
• 아직 결론은 없다. 계속 발전 중…
• 매년 GDC, Siggraph를 지켜봐주세요~
59. 맺음말
• 게임의 성격에 맞게 적합한 선택하는
것이 매우 중요
– 게임 엔진 입장에서는 “유연한 파이프라인”을 제
공할 필요!
• 지금 시점에서…
– DirectX9 : Deferred / Light Pre Pass / Forward
– DirectX11 : Tile Based Deferred / Forward
• Mobile에서도 Multiple Lighting의 시대 Coming Soon!!