ݺߣ

ݺߣShare a Scribd company logo
Forward Rendering /
 Deferred Rendering
   이창희(cagetu@softnette.com)
               ㈜소프트네트
이창희
(@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
Deferred Rendering
      • 모든 Occlusion이 해결된 후에 Shading을 수행하
        는 렌더링 파이프라인을 재구성해보자!
        – 각 픽셀에서 보이는 surface geometry에 대한
          정보를 출력 (a.k.a “g-buffer”)
        – Shading은 모든 geometry 처리가 끝날 때까지
          지연되어, 실제 화면에 보이는 면(Pixel)에 대해
          서만 G-Buffer를 참조하여 처리 된다
        – 셰이딩과 지오메트리 렌더링의 분리
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...
[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)
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
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
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
Deferred Rendering

LIGHT CULLING
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 Light Culling

TILE BASED RENDERING
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

More Related Content

[Kgc2012] deferred forward 이창희

  • 1. Forward Rendering / Deferred Rendering 이창희(cagetu@softnette.com) ㈜소프트네트
  • 2. 이창희 (@cagetu) - 소프트네트 - CCR - Hi-Win - Netmarble(現, CJ E&M) - DreamSEED - SAMSONCORE
  • 3. 오늘의 주제 • 더욱 사실감 있는 Dynamic Lighting을 처 리하기 위해 Rendering Pipeline이 어떻 게 발전했는지를 알아본다. • Forward Rendering / Deferred Rendering • Tile Based Rendering • Forward +
  • 5. Forward Rendering • 전통적인 렌더링 파이프라인을 통해서 셰이딩 되는 방식을 말 한다.
  • 6. Shading. • Forward Rendering 에서 다수의 라이팅을 처리하는 방법.
  • 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)
  • 14. Shading. • 화면공간에서 각 라이트에 대해서 G-Buffer를 샘 플링하여 셰이딩을 계산하고, 그 결과를 누적!
  • 15. 문제점 MSAA – 2D 스크린 상에서 처리되기 때문에 MSAA 지원 불가 – Screen Space Anti Aliasing … Transparency – 반투명 불가능 – 별도의 포워드 렌더링으로 처리 MRT – 제한된 Shading 모델 (G-Buffer의 한계) – 많은 양의 Memory 사용 – High Bandwidth cost (각 라이트 계산 시, G-Buffer를 Reload)
  • 18. 라이트 프리 패스 LIGHT PRE PASS RENDERING
  • 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
  • 22. Light Pre Pass 사례 [OROCHI] 건슬링거 스트라토스
  • 23. Light Pre Pass 사례 워해머 40,000 : 스페이스 마린
  • 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
  • 28. Physically Based Lighting http://cagetu.egloos.com/5547735
  • 29. Call Of Duty : Black Ops
  • 30. God of War 3 • Forward Rendering에서도 효율적으로 Mutiple Lighting의 처리가 가능함을 보 여줌 – Vertex Shader에서 Light들을 하나의 라이트 로 합성, Pixel Shader에서는 하나의 라이트만 처리하는 방식
  • 32. Sample [Source Code] http://cagetu.egloos.com/5603566 http://dragonjoon.egloos.com/10845216
  • 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과 비슷
  • 37. Light Culling • Light Volume – 라이트 범위에 맞게 Light Volume을 렌더링! • Point Light (Sphere) • Spot Light (Cone) • Directional Light (FullScreen)
  • 38. Stencil Light Volume • Stencil Shadow와 유사하게, extrude된 Shadow Volume과 장 면 geometry와 교차된 부분만 Shading! • 최적화가 가능하지만, 각 라이트 에 대해서 RenderState 변경이 요 구되고, 2 Pass 렌더링이 요구된 다. 즉, Batching 처리를 방해!
  • 40. Light Volume Z tests • 단순히 Z Test만을 이용해서, (Stencil보다는 덜 정교하지만) Shading 되는 부분을 얻는다. • Light Volume 뒷면을 그린다면, D3DCMP_GREATER – 라이트가 “공중에 떠 있는” 부분을 제거 • Light Volume의 앞면을 그린다면, D3DCMP_LESS – “지면 아래에 묻히는” 라이트 지역을 제거 • Batching이 가능하기 때문에, Light Volume Rendering에 대한 부담이 조금을 줄어든다.
  • 42. Tile Based Light Culling TILE BASED 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
  • 45. Tile Based Deferred Shading Just like…
  • 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!!
  • 62. • 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