Game Dev/Article

Inferred Lighting

AKer 2016. 10. 13. 08:43
반응형

개요

  • infer : 추론하다, 추측하다, 언급하다.
  • 낮은 해상도에서 Lighting을 수행한다.
    • 따라서 Material Shader가 낮은 해상도에서도 정확한 Lighting 값을 "추론"할 수 있는 Filtering Algorithm이 중요함
  • 3번의 Rendering Pass가 필요하다. 하지만 투명한 오브젝트에 대해서 별도의 렌더링이 필요하지 않다.
  • 최종 결과물은 HW Anti-Aliasing이 적용되도록 한다.

  • Light Pre-pass는 투명한 오브젝트를 그릴 때 Forward Rendering이 필요함
  • Light Pre-pass는 Light Buffer의 해상도가 커야 함 (=Full resolution)
  • Light Pre-pass나 Standard Deferred에 비해서 기본 Render Cost가 높음
    • Light가 없거나 적어도...

구현

Geometry Pass

  • Input : Normal, Depth, DSF(=Discontinuity Sensitive Filter) Data
  • Output : G-Buffer (=Geometry Buffer)
    • Low Resolution
    • Normal은 RG16을 사용하여 x, y만 저장하고 z는 계산함
    • DSF 정보도 RG16 사용하며 depth와 ID를 저장함
      • 하단의 DSF 섹션 참고
    • 구현이나 필요성에 따라서 Spec Power, Material ID, Motion Vector 등을 저장 가능

Light Pass

  • Ambient와 Dynamic Light를 계산한다.
  • Input : G-Buffer
  • Output : L-Buffer (=Light Buffer), Low Resolution
    • RGBA16 사용
      • RGB : Diffuse
      • A : Specular Intensity (Specular Color는 Material Pass에서 Diffuse Light Color를 이용)
    • Light가 영향을 주는 영역만 Stencil을 이용해서 그리도록 하자.

Material Pass

  • Input : L-Buffer
  • Output : Frame Buffer
    • Full Resolution
이 Pass에서 Lighting을 수행하는데 불투명한 오브젝트와 투명한 오브젝트를 같이 그리기 때문에 순서가 중요하다.
  1. 불투명한 오브젝트를 그린다.
  2. 투명한 오브젝트를 Back-to-Front 순서로 그린다.



DSF

  • Geometry Pass와 Lighting Pass에서 사용하는 Buffer의 해상도가 Material Pass의 해상도보다 작기 때문에 Aliasing이 발생하며 이를 DSF를 사용하여 해결한다. (자꾸 DSF 필터라고 부르고 싶음) 

점선 : FrameBuffer, 실선 : LightBuffer
회색으로 칠한 Fragment의 픽셀 P를 그릴 때 a, b, c만 Lighting에 포함되고 d는 버려짐


Object, Normal Group ID

  • DSF 정보는 총 16Bit

    • 상위 8Bit : Object ID (실제 Scene에 그려질 때 부여 됨)

    • 하위 8Bit : Normal Group ID (미리 계산하고 부여할 수 있음)

  • 이렇게 8Bit씩 나누어서 ID를 부여하기 때문에 실제로는 다른 Object지만 ID를 공유하는 경우가 생기고 이론상으로는 Visual Artifact가 생겨야 한다. 하지만 실제로 눈에 띄는 부작용은 거의 생기지 않는다고 한다.

  • 2개의 인접한 삼각형의 Vertex가 같은 Normal을 사용하면 같은 Normal Group이라고 봄


Alpha Polygon

구현

  • Geometry Pass에서 투명한 물체를 Stipple(=점묘법) 패턴으로 그린다.
  • Light Pass에서는 이렇게 점으로 그려진 투명한 물체도 같이 Lighting 된다.
  • Material Pass
    • 불투명한 물체의 DSF에서 이렇게 Stipple로 그려진 Alpha Pixel은 무시된다.
    • 투명한 물체의 DSF는 같은 Stipple로 그려진 4개의 Light Buffer 샘플을 가지고 이뤄진다.

제약

  • Stipple 패턴이 보통 2x2 픽셀을 사용하기 때문에 투명한 물체는 불투명한 물체의 절반 해상도 Lighting이 된다.
    • 2x2 패턴 : 3 Alpha Layer + 불투명한 오브젝트
    • 4x4 패턴 : 15 Alpha Layer + 불투명한 오브젝트 (단 패턴이 커질수록 해상도가 많이 떨어짐)
  • 반대로 불투명한 물체는 투명한 물체가 픽셀을 차지하고 있는만큼 Light Buffer 사용이 불가능하다.

왼쪽 : Light Buffer에 Stipple 패턴으로 그려진 투명한 물체

오른쪽 : 투명한 물체에 초록, 파랑색으로 Lighting도 잘 된 최종 결과


T1~T3 : Transparent Object / O : Opaque Object

2x2 패턴에서 3개의 투명 물체로 모든 Layer를 다 사용한 모습

개선점

  • 높은 편에 속하는 기본 Rendering Cost를 줄여야 한다.
  • DSF는 4번의 Sampling이 필요한데 HW에서 지원하는 Bilinear Filtering으로 바꿔본다.
  • Layer 개수에 제한이 있는 투명한 물체

참고

http://www.students.science.uu.nl/~3220516/advancedgraphics/papers/inferred_lighting.pdf

https://mynameismjp.wordpress.com/2010/01/10/inferred-rendering/


반응형

'Game Dev > Article' 카테고리의 다른 글

Forward+ Rendering  (1) 2016.10.19
Premultiplied alpha  (0) 2016.10.14
Light Pre-Pass Renderering (=Deferred Lighting)  (0) 2016.10.09
Light Indexed Deferred Rendering  (0) 2016.10.08