2. Introduction
• 보통 사용하는 Forward Shading에서는 라이
팅 비용이 비싸다.
– 각각의 오브젝트마다 라이팅
– 게임에서 사용하는 라이트 개수가 많아지고 있다.
• G-buffer에 라이팅 재료들을 렌더링하고 라
이팅에 오브젝트들 대신 G-buffer를 사용.
– 라이팅 비용을 줄인다.
– Deferred Shading
3. Three major options for
real-time lighting
• Forward Rendering
– single pass with multiple lights
– multiple passes with multiple lights lighting
• Deferred Rendering
25. Per-Pixel Lighting
float4 DirLightingPS(VS_OUTPUT1 In) : COLOR
{
half4 diffuseTex = tex2D(MRT0Sampler, In.TexCoord);
half4 normalTex = tex2D(MRT1Sampler, In.TexCoord);
half z = tex2D(MRT2Sampler, In.TexCoord);
//reconstruct original view-space position
float x = In.Position2.x;
float y = In.Position2.y;
float4 position = mul(float4(x, y, z, 1.0), InvProj);
position.xyz = position.xyz / position.www;
position.w = 1.0f;
//compute position in light space
…
//diffuse lighting
finalLighting = shadow * diffuse + Ambient + emissive;
return float4(finalLighting, 1.0f);
}
26. 극복해야 할 사항
• Transparency
– alpha blending
– G-buffer는 하나의 픽셀만 저장하기 때문에
Forward Rendering처럼 갂단하지 않다.
• Anti-Aliasing
– Forward Rendering처럼 frame buffer에 직접
렌더링할때 자동으로 받는 하드웨어 anti-
aliasing이 불가능
27. 결론
• O(1)에 Lighting을 할 수 있다.
– 오브젝트 개수에 상관없이 상수 시갂에 라이
팅이 가능하다.
• 사용하는 렌더 타겟의 개수가 늘어나는게
부담.
• Transparency, AA 등 극복해야 하는 문제
점들이 존재.
28. 참고
• Deferred Shading – NVIDIA
• Deferred Rendering in Leadwerks Engine
• HDR Deferred Shading – NVIDIA SDK