반응형
개요
- 총 3번의 Rendering Pass가 필요하다.
- 하지만 Standard Deferred Rendering에 비해서 Render Target이 많이 필요하지 않다.
- 가장 중요한 아이디어는 머트리얼과 빛의 속성을 분리해서 그리는 것!
구현
- Z-Buffer에는 Depth, Render Target에는 Normal(+Specualr Factor)만 그린다.
- MRT 필요하지 않음
- Light Buffer에 Light 속성을 그린다. (하단의 Light Buffer 참고)
- 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 |