Light Pre-Pass 작성  :  이창희 (cagetu79@gmail.com) 발표 : 2009 년 7 월  4 일
Introduction Deferred Renderer 의 경우 G-Buffer 안에  Material Property 들을 저장하는데 , G-Buffer 의 공간은 매우 제한적이다 .  모든  Material 들에 대해서 아주 유사한  Lighting  공식이 사용되는 것을 요구한다 . Lighting Stage 안에서  Pixel shader switching 은  screen space 에서  pixel 마다 발생할 것이기 때문에 아주 비쌀 것이다 .  제한적인  Material  지원과 많은 양의  memory bandwidth 는  Light Pre-Pass Renderer 의 원인이 되었다 .
Introduction(Cont.) First Phase Deferred Lighting Renderer 는  G-Buffer 안에  material property 들을 저장하는 반면에 , Light Pre-Pass 는  depth 와  normal 을  1 개나  2 개의  RenderTarget  저장한다 . Second Phase Light Pre-Pass Renderer 는  light buffer 안으로 모든  light 들의  light property 들을 저장한다 .  그래서  Deferred Lighting renderer 가 각  light 에 대해 전체 조명계산식을 사용하는 반면에 , light buffer 안에 오직 조명계산식의 일부분을 저장한다 .
Geomety Phase Opaque object 들에 대해서 , view space normal 과  eye-space depth 를 저장한다 . Transparent Object 들은 분리된  rendering path 를 이용한다 하나의  RenderTarget 에 저장 -RG: normal.xy -BA: depth
Light Phase Light property 들을 그리는 기본적인 요구는 어떻게  light property 들과 모든 다른  property 들을 에 분리하고 나중에 다시 구성할 수 있도록 조명계산식을 분리하느냐에 방법을 찾는 것이다 .  간단한  Point Light  공식 : Color = Ambient + Shadow * Att * (N.L * DiffColor * DiffIntensity * LightColor + R.V^n *    SpecColor * SpecIntensity * LightColor) 모든  property 들은  light vector 와  light color 에 의존한다 - N.L - LightColor - R.V^n - Attenuation Light property 들을 저장하는 하나의 방법은  4 개의  channel render target 을 사용하는 것    LightColor.r * N.L * Att LightColor.g * N.L * Att LightColor.b * N.L * Att R.V^n * N.L * Att
Re-Construct Forward rendering pass 에서  pixel  마다 개별적으로  diffuse 와  specular 항을 재구성하는 방법 나눠져 있는  term 은  forward rendering pass 에서 나중에  specular 항을 재구성하기 위해 저장될 수 있다 . Specular 항을 구성하기 위한 규칙들이  Light Pre-Pass Renderer 에 더 적합하도록 새로운 항을 생성하여 알맞게 바뀔 수 있다 . 더  tight 하게 압축된  render target 을 만들기 위해 다른 공간 안에 이동
Re-Construct(Cont.) 추가적인  diffuse term 을 저장 LightColor.r * N.L * Att LightColor.g * N.L * Att LightColor.b * N.L * Att R.V^n * N.L * Att N.L * Att (R.V^n * N.L * Att) / ( N.L * Att) 을 통해서 ,  (R.V^n)^mn * SpecColor 로  light 의  specular  항과  material 의  specular power / specular color 를 사용할 수 있다 . 단 , 4 개의 저장할 수 있는  channel 이 넘으므로 ,  추가적인  Render Target 가  Light Buffer 를 위해 요구된다 . Specular lighting  규칙들을 변경 (R.V^n * N.L * Att) ^ nm
:Diffuse Light Buffer :Specular Light Buffer
Conculsion MRT 의 지원이 없어도 구현이 가능하다 .  따라서 , low spec graphic hardware 에서 구현이 가능하다 .( 이게 의미가 있나 ?) 마지막  pass 가  forward renderer 를 이용하기 때문에 , Deferred Lighting 의 단점인  MSAA 의 문제를 해결할 수 있다 . 각  light source 에 대해 쓰고 읽을 수 있는  render target 들에 의해 소모되는  memory bandwidth 의 양이  Deferred Lighting Render 가  4 개의 텍스쳐를 사용하는 데 비해 ,  각 라이트에 대해 불려지는 단  2 개의 텍스쳐가 필요하기 때문에 더 작아진다 . Deferred Lighting 과 비교하여  Light Pre-Pass 는  material  구현에 관하여 더 유연성 (flexibility) 를 제공한다 .
Conclusion(Cont.) Deferred Lighting 과는 결과를 놓고 비교해보기 전에는 알 수 없음 .  단 , Memory bandwidth 면에서 봤을 때에는 확실한 이득을 얻을 수 있다 . ( MT  프레임웍  2.0 의 기사 참고 ) 여러 개의  light 에 대해서  specular  항을 계산할 때의 문제점  ( GameDev.net ) (Ra.Va)^n + (Rb.Vb)^n + ... + (Ri.Vi)^n != (Ra.Va + Rb.Vb + .. + Ri.Vi)^n 아직은 아이디어일 뿐 ,  실제로는 더 연구가 요망
Reference http://diaryofagraphicsprogrammer.blogspot.com/2008/03/light-pre-pass-renderer.html http://www.gamedev.net/community/forums/topic.asp?topic_id=522234 http://www.gamedev.net/community/forums/topic.asp?topic_id=487154 http://blog.nextrevision.com/?p=49 http://drilian.com/category/development/graphics/light-pre-pass-render/ http://www.flickr.com/photos/killerbunny/sets/72157604880714722/   http://game.sorenhannibal.com/
Q & A

Light Pre-Pass

  • 1.
    Light Pre-Pass 작성 : 이창희 (cagetu79@gmail.com) 발표 : 2009 년 7 월 4 일
  • 2.
    Introduction Deferred Renderer의 경우 G-Buffer 안에 Material Property 들을 저장하는데 , G-Buffer 의 공간은 매우 제한적이다 . 모든 Material 들에 대해서 아주 유사한 Lighting 공식이 사용되는 것을 요구한다 . Lighting Stage 안에서 Pixel shader switching 은 screen space 에서 pixel 마다 발생할 것이기 때문에 아주 비쌀 것이다 . 제한적인 Material 지원과 많은 양의 memory bandwidth 는 Light Pre-Pass Renderer 의 원인이 되었다 .
  • 3.
    Introduction(Cont.) First PhaseDeferred Lighting Renderer 는 G-Buffer 안에 material property 들을 저장하는 반면에 , Light Pre-Pass 는 depth 와 normal 을 1 개나 2 개의 RenderTarget 저장한다 . Second Phase Light Pre-Pass Renderer 는 light buffer 안으로 모든 light 들의 light property 들을 저장한다 . 그래서 Deferred Lighting renderer 가 각 light 에 대해 전체 조명계산식을 사용하는 반면에 , light buffer 안에 오직 조명계산식의 일부분을 저장한다 .
  • 4.
    Geomety Phase Opaqueobject 들에 대해서 , view space normal 과 eye-space depth 를 저장한다 . Transparent Object 들은 분리된 rendering path 를 이용한다 하나의 RenderTarget 에 저장 -RG: normal.xy -BA: depth
  • 5.
    Light Phase Lightproperty 들을 그리는 기본적인 요구는 어떻게 light property 들과 모든 다른 property 들을 에 분리하고 나중에 다시 구성할 수 있도록 조명계산식을 분리하느냐에 방법을 찾는 것이다 . 간단한 Point Light 공식 : Color = Ambient + Shadow * Att * (N.L * DiffColor * DiffIntensity * LightColor + R.V^n * SpecColor * SpecIntensity * LightColor) 모든 property 들은 light vector 와 light color 에 의존한다 - N.L - LightColor - R.V^n - Attenuation Light property 들을 저장하는 하나의 방법은 4 개의 channel render target 을 사용하는 것   LightColor.r * N.L * Att LightColor.g * N.L * Att LightColor.b * N.L * Att R.V^n * N.L * Att
  • 6.
    Re-Construct Forward renderingpass 에서 pixel 마다 개별적으로 diffuse 와 specular 항을 재구성하는 방법 나눠져 있는 term 은 forward rendering pass 에서 나중에 specular 항을 재구성하기 위해 저장될 수 있다 . Specular 항을 구성하기 위한 규칙들이 Light Pre-Pass Renderer 에 더 적합하도록 새로운 항을 생성하여 알맞게 바뀔 수 있다 . 더 tight 하게 압축된 render target 을 만들기 위해 다른 공간 안에 이동
  • 7.
    Re-Construct(Cont.) 추가적인 diffuse term 을 저장 LightColor.r * N.L * Att LightColor.g * N.L * Att LightColor.b * N.L * Att R.V^n * N.L * Att N.L * Att (R.V^n * N.L * Att) / ( N.L * Att) 을 통해서 , (R.V^n)^mn * SpecColor 로 light 의 specular 항과 material 의 specular power / specular color 를 사용할 수 있다 . 단 , 4 개의 저장할 수 있는 channel 이 넘으므로 , 추가적인 Render Target 가 Light Buffer 를 위해 요구된다 . Specular lighting 규칙들을 변경 (R.V^n * N.L * Att) ^ nm
  • 8.
    :Diffuse Light Buffer:Specular Light Buffer
  • 9.
    Conculsion MRT 의지원이 없어도 구현이 가능하다 . 따라서 , low spec graphic hardware 에서 구현이 가능하다 .( 이게 의미가 있나 ?) 마지막 pass 가 forward renderer 를 이용하기 때문에 , Deferred Lighting 의 단점인 MSAA 의 문제를 해결할 수 있다 . 각 light source 에 대해 쓰고 읽을 수 있는 render target 들에 의해 소모되는 memory bandwidth 의 양이 Deferred Lighting Render 가 4 개의 텍스쳐를 사용하는 데 비해 , 각 라이트에 대해 불려지는 단 2 개의 텍스쳐가 필요하기 때문에 더 작아진다 . Deferred Lighting 과 비교하여 Light Pre-Pass 는 material 구현에 관하여 더 유연성 (flexibility) 를 제공한다 .
  • 10.
    Conclusion(Cont.) Deferred Lighting과는 결과를 놓고 비교해보기 전에는 알 수 없음 . 단 , Memory bandwidth 면에서 봤을 때에는 확실한 이득을 얻을 수 있다 . ( MT 프레임웍 2.0 의 기사 참고 ) 여러 개의 light 에 대해서 specular 항을 계산할 때의 문제점 ( GameDev.net ) (Ra.Va)^n + (Rb.Vb)^n + ... + (Ri.Vi)^n != (Ra.Va + Rb.Vb + .. + Ri.Vi)^n 아직은 아이디어일 뿐 , 실제로는 더 연구가 요망
  • 11.
    Reference http://diaryofagraphicsprogrammer.blogspot.com/2008/03/light-pre-pass-renderer.html http://www.gamedev.net/community/forums/topic.asp?topic_id=522234http://www.gamedev.net/community/forums/topic.asp?topic_id=487154 http://blog.nextrevision.com/?p=49 http://drilian.com/category/development/graphics/light-pre-pass-render/ http://www.flickr.com/photos/killerbunny/sets/72157604880714722/   http://game.sorenhannibal.com/
  • 12.