Game Dev/Article

Light Pre-Pass Renderering (=Deferred Lighting)

AKer 2016. 10. 9. 10:21
반응형

개요

  • 총 3번의 Rendering Pass가 필요하다.
  • 하지만 Standard Deferred Rendering에 비해서 Render Target이 많이 필요하지 않다.
  • 가장 중요한 아이디어는 머트리얼과 빛의 속성을 분리해서 그리는 것!


구현

  1. Z-Buffer에는 Depth, Render Target에는 Normal(+Specualr Factor)만 그린다.
    • MRT 필요하지 않음
  2. Light Buffer에 Light 속성을 그린다. (하단의 Light Buffer 참고)
  3. Forward Rendering으로 Geometry를 그리면서 Lighting을 수행한다.


Light Buffer

다음은 일반적인 Lighting

Color = Ambient + Shadow * Att * (N.L * DiffColor * DiffIntensity * LightColor + R.V^n * SpecColor * SpecIntensity * LightColor)


- Att : Attenuation

- N : Normal Vector

- L : Light Vector

- R : Reflection Vector

- V : View Vector

- ^n : pow n


위에서 붉은색으로 칠한 부분이 Lighting 속성이기 때문에 Render Target에는 필요한 것만 그리면 된다.

  • RGBA8 일 때
    • R : LightColor.r * N.L * Att
    • G : LightColor.g * N.L * Att
    • B : LightColor.b * N.L * Att
    • A : R.V^n * N.L * Att
      • 이 구현에서는 Specular에 별도의 Color가 없는데 확장할 수도 있음

Light 속성을 다시 읽는 것은 간단하다.
float4 ps_main( PS_INPUT Input ) : COLOR0
{
    float4 Light = tex2D( Light_Buffer, Input.texCoord );
    float3 NLATTColor = float3(Light.x, Light.y, Light.z);
    float3 Lighting = NLATTColor + Light.www;
    return float4(Lighting, 1.0f);
}


Lighting 공식

Stanard Deferred



Light Pre-Pass


참고

http://diaryofagraphicsprogrammer.blogspot.kr/2008/03/light-pre-pass-renderer.html

http://www.realtimerendering.com/blog/deferred-lighting-approaches/


반응형

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

Premultiplied alpha  (0) 2016.10.14
Inferred Lighting  (0) 2016.10.13
Light Indexed Deferred Rendering  (0) 2016.10.08
CppCon2014 : C++ in Huge AAA Games  (0) 2016.10.08