Download - [Kgc2012] deferred forward 이창희
이창희 (@cagetu) - 소프트네트
- CCR
- Hi-Win
- Netmarble(現, CJ E&M)
- DreamSEED
- SAMSONCORE
오늘의 주제 • 더욱 사실감 있는 Dynamic Lighting을 처
리하기 위해 Rendering Pipeline이 어떻게 발전했는지를 알아본다.
• Forward Rendering / Deferred Rendering
• Tile Based Rendering
• Forward +
FORWARD RENDERING (전통적인)
Forward Rendering
• 전통적인 렌더링 파이프라인을 통해서 셰이딩 되는 방식을 말한다.
Shading.
• Forward Rendering 에서 다수의 라이팅을 처리하는 방법.
문제점
• 화면에 렌더링되지 않아도 되는 면(Culling)도 셰이딩 연산을 해야만 한다.
• 라이트 증가에 따른 계산의 복잡성이 증가 • 다른 라이트 종류 (directional, spot, point …)
• 오브젝트가 영향 받는 “light list”를 찾아야…
• 라이트 개수/종류에 따른 “Shader Explosion”
• 한 번에 계산할 수 있는 라이트 수의 한계 (셰이더 상수)
DEFERRED RENDERING (전통적인)
• 모든 Occlusion이 해결된 후에 Shading을 수행하는 렌더링 파이프라인을 재구성해보자!
– 각 픽셀에서 보이는 surface geometry에 대한 정보를 출력 (a.k.a “g-buffer”)
– Shading은 모든 geometry 처리가 끝날 때까지 지연되어, 실제 화면에 보이는 면(Pixel)에 대해서만 G-Buffer를 참조하여 처리 된다
– 셰이딩과 지오메트리 렌더링의 분리
Deferred Rendering
Pipeline
Pass 1 : Geometry Pass
– G-Buffer에 화면에 보이는 Geometry 정보를 기록
Pass 2 : Shading Pass
– 화면 공간에서 G-Buffer를 샘플링해서 셰이딩을 계산한다.
G-Buffer
• 셰이딩에 필요한 모든 Geometry의 정보를 버퍼(Multiple Render Target)에 기록한다.
– Position, Normal
– Specular Information
– Albedo
– Etc...
G-Buffer
• G-Buffer의 효율적으로 관리가 중요!
– DX9 : 최대 4장, DX11 : 최대 8장
– Normal Encording (XYZ -> XY)
– Position Restruction (Depth -> Position)
– Bit Packing (16bit Channel -> 8bit<<8bit)
Shading.
• 화면공간에서 각 라이트에 대해서 G-Buffer를 샘플링하여 셰이딩을 계산하고, 그 결과를 누적!
문제점 MSAA
– 2D 스크린 상에서 처리되기 때문에 MSAA 지원 불가 – Screen Space Anti Aliasing …
Transparency – 반투명 불가능 – 별도의 포워드 렌더링으로 처리
MRT – 제한된 Shading 모델 (G-Buffer의 한계) – 많은 양의 Memory 사용 – High Bandwidth cost (각 라이트 계산 시, G-Buffer를 Reload)
사례)
사례)
LIGHT PRE PASS RENDERING
라이트 프리 패스
NormalsSpecular Power
Depth
Light Buffer
Frame Buffer
Render opaque Geometry sorted front-to-back
Blit Lights into Light Buffer (sorted front-to-back)
Render opaque Geometry sorted front-to-backorBlit ambient term and other lighting terms into final image
Color
Light Pre-Pass Rendering
• Forward Rendering 하기 전에 Lighting을 미리 계산!
• 제한적 Material과 많은 메모리 사용에 대한 해결
[Siggraph09] The Light Pre Pass Renderer
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)
Light Pre-Pass Rendering
• 기본적으로 Forward Rendering!
• Material 사용에 제한이 없다.
• Geometry Pass를 두 번 렌더링! • Draw Call이 2배로 늘어난다!
• 최적화하기 위한 방안들이 필요!
• Bandwidth를 줄이지는 못한다. • 각 라이팅 계산에 대해서, G-Buffer reload
Light Pre Pass 사례
[OROCHI] 건슬링거 스트라토스
Light Pre Pass 사례
워해머 40,000 : 스페이스 마린
MORE CASE
다른 풀이 방식들…
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/
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
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
Physically Based Lighting http://cagetu.egloos.com/5547735
Call Of Duty : Black Ops
God of War 3
• Forward Rendering에서도 효율적으로 Mutiple Lighting의 처리가 가능함을 보여줌
– Vertex Shader에서 Light들을 하나의 라이트로 합성, Pixel Shader에서는 하나의 라이트만 처리하는 방식
God of War 3
Sample
[Source Code] http://cagetu.egloos.com/5603566 http://dragonjoon.egloos.com/10845216
LIGHT CULLING
Deferred Rendering
Light Culling • Lighting 계산은 Screen-Space에서 처리되기
때문에, 각 라이트에 대해서 라이팅 범위(Pixel)을 최소화 해야 함. – Light Region Scissors Test – Light Volume
• Stencil Test • Z Tests
– Tile Based Light Culling
Light Culling
• Scissors Test
– 라이트에 의해 영향을 받는 Screen-Space Region을 계산하여, Scissor Test로 불필요한 Pixel 연산을 제외시킨다
– Masking과 비슷
[GDC2011] Deferred Shading Optimization
Light Culling
• Light Volume
– 라이트 범위에 맞게 Light Volume을 렌더링!
• Point Light (Sphere)
• Spot Light (Cone)
• Directional Light (FullScreen)
Stencil Light Volume • Stencil Shadow와 유사하게,
extrude된 Shadow Volume과 장면 geometry와 교차된 부분만 Shading!
• 최적화가 가능하지만, 각 라이트에 대해서 RenderState 변경이 요구되고, 2 Pass 렌더링이 요구된다. 즉, Batching 처리를 방해!
Stencil Light Volume
Light Volume Z tests
• 단순히 Z Test만을 이용해서, (Stencil보다는 덜 정교하지만) Shading 되는 부분을 얻는다.
• Light Volume 뒷면을 그린다면, D3DCMP_GREATER – 라이트가 “공중에 떠 있는” 부분을 제거
• Light Volume의 앞면을 그린다면, D3DCMP_LESS – “지면 아래에 묻히는” 라이트 지역을 제거
• Batching이 가능하기 때문에, Light Volume Rendering에 대한 부담이 조금을 줄어든다.
Light Volume
• 샘플 장면…
TILE BASED RENDERING
Tile Based Light Culling
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이라고 해야 한다!
Tile Based Deferred Shading
• Screen Space의 Overhead를 분산시키는 것이 목표!
• 장면을 고정된 크기의 타일로 나누고, 타일에서 영향을 받는 라이트만 계산
• G-Buffer를 한번만 읽으면 모든 라이트를 계산할 수 있다.
[GDC08] The Technology of Uncharted : Drake’s Fortune
Tile Based Deferred Shading
Just like…
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 조합
Tile Based Light Culling
• Compute Shader의 도입! • Compute Shader가 2D Thread
Group을 가지고 처리할 수 있도록 Screen Space Tile로 구분한다면, 싱글 패스에서 모든 처리가능!
• 타일 당 Thread Group, 픽셀 당 Thread 할당
Tile Based Light Culling
[Siggraph2010] Deferred Rendering for Current and Future Rendering Pipelines
Tile Based Deferred Shading • 장점
– Bandwidth Cost를 줄일 수 있다. • G-Buffer Read Once
– Screen Space Lighting Accumulation Overhead를 줄인다.
• 단점 – 일반적으로 아주 많은 수의 라이트에 적합하다고 알려짐
• 적은 수의 라이트 소스에 대해서는 Culling Overhead가 발생…
• 차세대 콘솔이나 GPU와 같이 높은 계산 능력과
Bandwidth의 비율을 가지는 디바이스에 사용하기 효율적이다.
Tile Based Deferred Shading
• GPU를 봤을 때, 메모리 대역폭(Memory
Bandwidth)보다 연산 능력(Computation Power)의 증가가
더 두드러지는 경향을 보인다!
– Compute Shader기반의 Tile Based Light Culling에 주목!!!
Must be Deferred?
점점 더 복잡한 셰이딩 모델을 요구! – Physically Based Lighting
• Microfacet BRDF, Anisotropic, Oren-Nayer, …
– G-Buffer의 한계
DirectX11 – Compute Shader, UAV등의 사용으로, 직접 연
산이 빠르게 가능해졌음!
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
Forward +
Forward +
• Forward + Light Culling • Light Culling
– Tile Based Light Culling과 동일 – 결과는 Tile당 Light Index List 저
장
• Forward Shading – Material 정보를 바로 적용 – Light Culling에서 계산된 Tile에
서 Light Index List를 얻어, Shading을 계산
Clustered Shading
“Cluster” – Tile Based Shading의 각 타일은 min/max Z 값을
가지고, sub frustum을 만든다. 하지만, 카메라 시점에 따라, depth bound 영향으로 성능과 강한 의존성을 가지게 된다.
– 고정된 3차원 영역으로 장면을 나누어, 뷰에 의존해서 성능이 감소할 경우는 없다!
– 고정된 3D 영역을 “Cluster”라고 한다.
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의 라이팅 정보를 읽어온다.
CONCLUSION
정리 & 결론
정리
• 효율적인 Dynamic Multiple Lighting에 대한 기술의 발전!
• 기본적으로 Deferred 방식 출발
• 더 빠르고 많은 Lighting 처리 요구
• 더 복잡한 Shading 처리에 대한 요구
• Low Bandwidth Cost, High Computation으로 발전!
• 아직 결론은 없다. 계속 발전 중… • 매년 GDC, Siggraph를 지켜봐주세요~
맺음말
• 게임의 성격에 맞게 적합한 선택하는 것이 매우 중요 – 게임 엔진 입장에서는 “유연한 파이프라인”을 제
공할 필요! • 지금 시점에서…
– DirectX9 : Deferred / Light Pre Pass / Forward
– DirectX11 : Tile Based Deferred / Forward
• Mobile에서도 Multiple Lighting의 시대 Coming Soon!!
Q & A
물어본다 & 대답한다
참고자료
• Lecture 12: Deferred Shading. Kayvon Fatahalian, Graphics and Imaging Architectures (CMU 15-869, Fall 2011)
• Practical Rendering & Computation with Direct3D11 • The Light Pre Pass Renderer [Siggraph09]
– http://www.bungie.net/News/content.aspx?type=topnews&link=Siggraph_09
• Light Indexed Deferred Rendering – http://code.google.com/p/lightindexed-deferredrender/
• Inferred Rendering – http://mynameismjp.wordpress.com/2010/01/10/inferred-rendering/
• Dynamic Lights in GOW3 – http://cagetu.egloos.com/5603566
• Clustered Rendering – http://www.cse.chalmers.se/~olaolss/main_frame.php?contents=publications
• Forward + – http://developer.amd.com/gpu_assets/AMD_Demos_LeoDemoGDC2012.ppsx