62
Forward Rendering / Deferred Rendering 이창희([email protected] ) ㈜소프트네트

[Kgc2012] deferred forward 이창희

Embed Size (px)

DESCRIPTION

KGC12 발표자료입니다. http://cagetu.egloos.com으로

Citation preview

Page 1: [Kgc2012] deferred forward 이창희

Forward Rendering / Deferred Rendering

이창희([email protected])

㈜소프트네트

Page 2: [Kgc2012] deferred forward 이창희

이창희 (@cagetu) - 소프트네트

- CCR

- Hi-Win

- Netmarble(現, CJ E&M)

- DreamSEED

- SAMSONCORE

Page 3: [Kgc2012] deferred forward 이창희

오늘의 주제 • 더욱 사실감 있는 Dynamic Lighting을 처

리하기 위해 Rendering Pipeline이 어떻게 발전했는지를 알아본다.

• Forward Rendering / Deferred Rendering

• Tile Based Rendering

• Forward +

Page 4: [Kgc2012] deferred forward 이창희

FORWARD RENDERING (전통적인)

Page 5: [Kgc2012] deferred forward 이창희

Forward Rendering

• 전통적인 렌더링 파이프라인을 통해서 셰이딩 되는 방식을 말한다.

Page 6: [Kgc2012] deferred forward 이창희

Shading.

• Forward Rendering 에서 다수의 라이팅을 처리하는 방법.

Page 7: [Kgc2012] deferred forward 이창희

문제점

• 화면에 렌더링되지 않아도 되는 면(Culling)도 셰이딩 연산을 해야만 한다.

• 라이트 증가에 따른 계산의 복잡성이 증가 • 다른 라이트 종류 (directional, spot, point …)

• 오브젝트가 영향 받는 “light list”를 찾아야…

• 라이트 개수/종류에 따른 “Shader Explosion”

• 한 번에 계산할 수 있는 라이트 수의 한계 (셰이더 상수)

Page 8: [Kgc2012] deferred forward 이창희

DEFERRED RENDERING (전통적인)

Page 9: [Kgc2012] deferred forward 이창희

• 모든 Occlusion이 해결된 후에 Shading을 수행하는 렌더링 파이프라인을 재구성해보자!

– 각 픽셀에서 보이는 surface geometry에 대한 정보를 출력 (a.k.a “g-buffer”)

– Shading은 모든 geometry 처리가 끝날 때까지 지연되어, 실제 화면에 보이는 면(Pixel)에 대해서만 G-Buffer를 참조하여 처리 된다

– 셰이딩과 지오메트리 렌더링의 분리

Deferred Rendering

Page 10: [Kgc2012] deferred forward 이창희

Pipeline

Pass 1 : Geometry Pass

– G-Buffer에 화면에 보이는 Geometry 정보를 기록

Pass 2 : Shading Pass

– 화면 공간에서 G-Buffer를 샘플링해서 셰이딩을 계산한다.

Page 11: [Kgc2012] deferred forward 이창희

G-Buffer

• 셰이딩에 필요한 모든 Geometry의 정보를 버퍼(Multiple Render Target)에 기록한다.

– Position, Normal

– Specular Information

– Albedo

– Etc...

Page 12: [Kgc2012] deferred forward 이창희
Page 13: [Kgc2012] deferred forward 이창희

G-Buffer

• G-Buffer의 효율적으로 관리가 중요!

– DX9 : 최대 4장, DX11 : 최대 8장

– Normal Encording (XYZ -> XY)

– Position Restruction (Depth -> Position)

– Bit Packing (16bit Channel -> 8bit<<8bit)

Page 14: [Kgc2012] deferred forward 이창희

Shading.

• 화면공간에서 각 라이트에 대해서 G-Buffer를 샘플링하여 셰이딩을 계산하고, 그 결과를 누적!

Page 15: [Kgc2012] deferred forward 이창희

문제점 MSAA

– 2D 스크린 상에서 처리되기 때문에 MSAA 지원 불가 – Screen Space Anti Aliasing …

Transparency – 반투명 불가능 – 별도의 포워드 렌더링으로 처리

MRT – 제한된 Shading 모델 (G-Buffer의 한계) – 많은 양의 Memory 사용 – High Bandwidth cost (각 라이트 계산 시, G-Buffer를 Reload)

Page 16: [Kgc2012] deferred forward 이창희

사례)

Page 17: [Kgc2012] deferred forward 이창희

사례)

Page 18: [Kgc2012] deferred forward 이창희

LIGHT PRE PASS RENDERING

라이트 프리 패스

Page 19: [Kgc2012] deferred forward 이창희

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

Page 20: [Kgc2012] deferred forward 이창희

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)

Page 21: [Kgc2012] deferred forward 이창희

Light Pre-Pass Rendering

• 기본적으로 Forward Rendering!

• Material 사용에 제한이 없다.

• Geometry Pass를 두 번 렌더링! • Draw Call이 2배로 늘어난다!

• 최적화하기 위한 방안들이 필요!

• Bandwidth를 줄이지는 못한다. • 각 라이팅 계산에 대해서, G-Buffer reload

Page 22: [Kgc2012] deferred forward 이창희

Light Pre Pass 사례

[OROCHI] 건슬링거 스트라토스

Page 23: [Kgc2012] deferred forward 이창희

Light Pre Pass 사례

워해머 40,000 : 스페이스 마린

Page 24: [Kgc2012] deferred forward 이창희

MORE CASE

다른 풀이 방식들…

Page 25: [Kgc2012] deferred forward 이창희

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/

Page 26: [Kgc2012] deferred forward 이창희

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

Page 27: [Kgc2012] deferred forward 이창희

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

Page 28: [Kgc2012] deferred forward 이창희

Physically Based Lighting http://cagetu.egloos.com/5547735

Page 29: [Kgc2012] deferred forward 이창희

Call Of Duty : Black Ops

Page 30: [Kgc2012] deferred forward 이창희

God of War 3

• Forward Rendering에서도 효율적으로 Mutiple Lighting의 처리가 가능함을 보여줌

– Vertex Shader에서 Light들을 하나의 라이트로 합성, Pixel Shader에서는 하나의 라이트만 처리하는 방식

Page 31: [Kgc2012] deferred forward 이창희

God of War 3

Page 32: [Kgc2012] deferred forward 이창희

Sample

[Source Code] http://cagetu.egloos.com/5603566 http://dragonjoon.egloos.com/10845216

Page 33: [Kgc2012] deferred forward 이창희

LIGHT CULLING

Deferred Rendering

Page 34: [Kgc2012] deferred forward 이창희

Light Culling • Lighting 계산은 Screen-Space에서 처리되기

때문에, 각 라이트에 대해서 라이팅 범위(Pixel)을 최소화 해야 함. – Light Region Scissors Test – Light Volume

• Stencil Test • Z Tests

– Tile Based Light Culling

Page 35: [Kgc2012] deferred forward 이창희

Light Culling

• Scissors Test

– 라이트에 의해 영향을 받는 Screen-Space Region을 계산하여, Scissor Test로 불필요한 Pixel 연산을 제외시킨다

– Masking과 비슷

Page 36: [Kgc2012] deferred forward 이창희

[GDC2011] Deferred Shading Optimization

Page 37: [Kgc2012] deferred forward 이창희

Light Culling

• Light Volume

– 라이트 범위에 맞게 Light Volume을 렌더링!

• Point Light (Sphere)

• Spot Light (Cone)

• Directional Light (FullScreen)

Page 38: [Kgc2012] deferred forward 이창희

Stencil Light Volume • Stencil Shadow와 유사하게,

extrude된 Shadow Volume과 장면 geometry와 교차된 부분만 Shading!

• 최적화가 가능하지만, 각 라이트에 대해서 RenderState 변경이 요구되고, 2 Pass 렌더링이 요구된다. 즉, Batching 처리를 방해!

Page 39: [Kgc2012] deferred forward 이창희

Stencil Light Volume

Page 40: [Kgc2012] deferred forward 이창희

Light Volume Z tests

• 단순히 Z Test만을 이용해서, (Stencil보다는 덜 정교하지만) Shading 되는 부분을 얻는다.

• Light Volume 뒷면을 그린다면, D3DCMP_GREATER – 라이트가 “공중에 떠 있는” 부분을 제거

• Light Volume의 앞면을 그린다면, D3DCMP_LESS – “지면 아래에 묻히는” 라이트 지역을 제거

• Batching이 가능하기 때문에, Light Volume Rendering에 대한 부담이 조금을 줄어든다.

Page 41: [Kgc2012] deferred forward 이창희

Light Volume

• 샘플 장면…

Page 42: [Kgc2012] deferred forward 이창희

TILE BASED RENDERING

Tile Based Light Culling

Page 43: [Kgc2012] deferred forward 이창희

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이라고 해야 한다!

Page 44: [Kgc2012] deferred forward 이창희

Tile Based Deferred Shading

• Screen Space의 Overhead를 분산시키는 것이 목표!

• 장면을 고정된 크기의 타일로 나누고, 타일에서 영향을 받는 라이트만 계산

• G-Buffer를 한번만 읽으면 모든 라이트를 계산할 수 있다.

[GDC08] The Technology of Uncharted : Drake’s Fortune

Page 45: [Kgc2012] deferred forward 이창희

Tile Based Deferred Shading

Just like…

Page 46: [Kgc2012] deferred forward 이창희

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 조합

Page 47: [Kgc2012] deferred forward 이창희

Tile Based Light Culling

• Compute Shader의 도입! • Compute Shader가 2D Thread

Group을 가지고 처리할 수 있도록 Screen Space Tile로 구분한다면, 싱글 패스에서 모든 처리가능!

• 타일 당 Thread Group, 픽셀 당 Thread 할당

Page 48: [Kgc2012] deferred forward 이창희

Tile Based Light Culling

[Siggraph2010] Deferred Rendering for Current and Future Rendering Pipelines

Page 49: [Kgc2012] deferred forward 이창희

Tile Based Deferred Shading • 장점

– Bandwidth Cost를 줄일 수 있다. • G-Buffer Read Once

– Screen Space Lighting Accumulation Overhead를 줄인다.

• 단점 – 일반적으로 아주 많은 수의 라이트에 적합하다고 알려짐

• 적은 수의 라이트 소스에 대해서는 Culling Overhead가 발생…

• 차세대 콘솔이나 GPU와 같이 높은 계산 능력과

Bandwidth의 비율을 가지는 디바이스에 사용하기 효율적이다.

Page 50: [Kgc2012] deferred forward 이창희

Tile Based Deferred Shading

• GPU를 봤을 때, 메모리 대역폭(Memory

Bandwidth)보다 연산 능력(Computation Power)의 증가가

더 두드러지는 경향을 보인다!

– Compute Shader기반의 Tile Based Light Culling에 주목!!!

Page 51: [Kgc2012] deferred forward 이창희

Must be Deferred?

점점 더 복잡한 셰이딩 모델을 요구! – Physically Based Lighting

• Microfacet BRDF, Anisotropic, Oren-Nayer, …

– G-Buffer의 한계

DirectX11 – Compute Shader, UAV등의 사용으로, 직접 연

산이 빠르게 가능해졌음!

Page 52: [Kgc2012] deferred forward 이창희

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

Page 53: [Kgc2012] deferred forward 이창희

Forward +

Page 54: [Kgc2012] deferred 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을 계산

Page 55: [Kgc2012] deferred forward 이창희

Clustered Shading

“Cluster” – Tile Based Shading의 각 타일은 min/max Z 값을

가지고, sub frustum을 만든다. 하지만, 카메라 시점에 따라, depth bound 영향으로 성능과 강한 의존성을 가지게 된다.

– 고정된 3차원 영역으로 장면을 나누어, 뷰에 의존해서 성능이 감소할 경우는 없다!

– 고정된 3D 영역을 “Cluster”라고 한다.

Page 56: [Kgc2012] deferred forward 이창희

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의 라이팅 정보를 읽어온다.

Page 57: [Kgc2012] deferred forward 이창희

CONCLUSION

정리 & 결론

Page 58: [Kgc2012] deferred forward 이창희

정리

• 효율적인 Dynamic Multiple Lighting에 대한 기술의 발전!

• 기본적으로 Deferred 방식 출발

• 더 빠르고 많은 Lighting 처리 요구

• 더 복잡한 Shading 처리에 대한 요구

• Low Bandwidth Cost, High Computation으로 발전!

• 아직 결론은 없다. 계속 발전 중… • 매년 GDC, Siggraph를 지켜봐주세요~

Page 59: [Kgc2012] deferred forward 이창희

맺음말

• 게임의 성격에 맞게 적합한 선택하는 것이 매우 중요 – 게임 엔진 입장에서는 “유연한 파이프라인”을 제

공할 필요! • 지금 시점에서…

– DirectX9 : Deferred / Light Pre Pass / Forward

– DirectX11 : Tile Based Deferred / Forward

• Mobile에서도 Multiple Lighting의 시대 Coming Soon!!

Page 60: [Kgc2012] deferred forward 이창희

Q & A

물어본다 & 대답한다

Page 61: [Kgc2012] deferred forward 이창희

참고자료

Page 62: [Kgc2012] deferred forward 이창희

• 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