2. 차례
많은 광원을 그리는 방법들
Light Pre-Pass 소개
Light Pre-Pass 구현방법
Deferred Shading
GBuffer
Light Buffer
정리
질문
3. 많은 광원을 그리는 방법들
Deferred Shading / Rendering
Z Pre Pass Rendering
John D. Carmack II, Doom3
Light Pre Pass
Saito & Takahashi 1990
Wolfgang Engel 2008
Inferred Lighting
SIGGRAPH2009 Scott Kircher,Alan Lawrance
4. Z Pre Pass Rendering
존카멕이 처음 개발
Doom3 적용
Depth만을 가지고 Light계산
5. Deferred Shading
굉장히 배치가 간단해지고, 엔진에서 관리가 쉽다
일반적인 그림자 테크닉들과 통합이 쉽다
라이팅을 위한 계산이 “완전한” O(1) 복잡도를 가진다.
오브젝트의 개수와 상관없다
Lighting 계산의 부하가 Scene의 복잡도에 독립적이다.
수많은 작은 동적 라이팅 사용이 가능하다
Killzone 2’s G-Buffer Layout (courtesy of Michal Valient)
7. Deferred Shading 단점
투명 객체를 처리 못함
G-Buffer안에 Material Property들을 저장
G-Buffer의 공간은 매우 제한적 (최대 4장)
모든 Material들에 대해서 아주 유사한 Lighting 공식
이 사용되는 것을 요구
RenderTarget 4장사용으로 메모리양이 큼
Forward Rendering처럼 frame buffer에 직접 렌더링
할 때 자동으로 받는 하드웨어anti-aliasing이 불가능
9. Light Pre-Pass
MRT의 지원이 없어도 구현이 가능
기본적으로 2Pass로 랜더링을 이용하기 때문에 하드
웨어 MSAA를 지원
반투명 오브젝트는 2Pass 때 랜더링
Render Target는 한장만 사용
Shader 2.0 환경에서 구현가능 (크게 의미는 없음)
Deferred Shading 과 비교할때 메모리양이 적음
Material 구현에 관하여 더 유연성를 제공
2Pass 때 처리
11. Light Pre-Pass 단점
Deferred Shading 의 경우, 랜더는 최저 1회로 끝
MRT를 사용해 G-Buffer 에 랜더
Light Pre-Pass 는 기본적으로 2Pass 랜더
여러 개의 light에 대해서 specular 항을 계산할 때의
문제점 (GameDev.net)
Specular값을 텍스쳐 한장으로 담아야 하기 때문에…
16. G Buffer (1Pass)
Depth + Normal 추출
NORMAL압축하여 뽑음
Normal 압축함으로 퀄리티 향상도 할 수 있음
RG : normal
B : Depth
A : Alpha Test
A16FR16FG16FB16 포멧 사용
17. G Buffer (1Pass)
Gbuffer_VS
{
float4 position = float4( vertex.position , 1.0f );
Out.PosClip
= mul(position, WORLDVIEWPROJ);
Out.PosView
= mul(position, WORLDVIEW);
float3 N
= vertex.normal;
float3 T = vertex.tangent.xyz;
float3 B = cross(N,T) * vertex.tangent.w;
Out.TangentToView1 = mul( T, (float3x3)WORLDVIEW );
Out.TangentToView2 = mul( B, (float3x3)WORLDVIEW );
Out.TangentToView3 = mul( N, (float3x3)WORLDVIEW );
}
23. Light Buffer Pass
Screen Space에서 Gbuffer을 이용하여 Light를 계산
Light계산시 Light방향을 ViewSpace로 변환하여 계산
Depth로 위치를 뽑아서 Speculer을 계산
Point Light도 계산함
그림자도 Light계산시 같이 할 수 있음
A16FR16FG16FB16F 포멧으로 설정
Light buffer layout
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 (Speculer)
24. Light Buffer Pass
라이트버퍼 계산시 머트리얼 계산법
미리 계산해 놓으면 2Pass 때 빠르게 랜더링 할수 있
음
머트리얼을 미리 계산할시 랜더타겟 한장이 더 필요
26. 깊이 버퍼로부터 위치 계산
•
•
픽셀의 실제 위치를 얻어낼 시 depth buffer를 이용하여 만듬
픽셀의 카메라 스페이스 상 위치를 얻어오는 일반적인 방법은
Inverse Projection matrix를 곱해주는 것
Depth 저장시 WVP 변환 결과의 z/w값을 기입 하는 것이 아니고
WV 변환 결과의 Z만 저장 하여 Linear한 것으로 만들어 줌
floating 포맷이 아니라면 Zfar로 나누면 될 듯
좌상,우상,좌하,우하의 far clip 방향 ray
VS에 프러스텀의 정보를 넘겨줌
PS에서는 해당 좌표에 받은 ray(보간 되어 옴)정보를 기반으로
깊이와 곱하여 최종 위치를 구함
SSAO , Motion blur(depth based), DOF
FrustumCorner = Vector3(0,0,Far)
FrustumCorner.y = tan( FOV / 2 ) * Far
FrustumCorner.x = FrustumCorner.y * Aspect
36. 정리
수많은 동적 라이팅을 화면상의 오브젝트의 개수와 관
계없이 상수시간에 처리가 가능함
이론상 무한개의 동적 라이팅 사용 가능
어두운 실내나, 어두운 배경에 실시간 라이팅이 많은 경
우 최적의 해결 방법
현재의 그래픽 카드에서는 당연히 지원됨유명 상용 엔
진에서는 기본적으로 지원됨
직접 구현 해도, 개념이 어렵지 않고, 관리가 쉬움
셀프 셰도우등 그림자 기법이 용이함
포스트 프로세싱(DOF, SSAO, HDR등)을 사용시
G-Buffer 재사용 가능함
콘솔게임은 이미 많은 게임들이 사용되고 있음.
37. References
[Hargreaves] Shawn Hargreaves, “Deferred Shading”, http://www.talula.demon.co.uk/DeferredShading.pdf
[Lobanchikov] Igor A. Lobanchikov, “ GSC Game World„s S.T.A.L.K.E.R : Clear Sky – a showcase for Direct3D 10.0/1”,
http://developer.amd.com/gpu_assets/01GDC09AD3DDStalkerClearSky210309.ppt
[Mittring] Martin Mittring, “A bit more Deferred – Cry Engine 3”, http://www.slideshare.net/guest11b095/a-bit-more-deferred-cryengine3
[Lee] Mark Lee, “Resistance 2 Prelighting”, http://www.insomniacgames.com/tech/articles/0409/files/GDC09_Lee_Prelighting.pdf
[Lengyel] Eric Lengyel, “Advanced Light and Shadow Culling Methods”, http://www.terathon.com/lengyel/#slides
[Placeres] Frank Puig Placeres, “Overcoming Deferred Shading Drawbacks,” pp. 115 – 130, ShaderX5
[Shishkovtsov] Oles Shishkovtsov, “Making some use out of hardware multisampling”; http://olesrants.blogspot.com/2008/08/making-some-use-out-of-hardware.html
[Swoboda] Matt Swoboda, “Deferred Lighting and Post Processing on PLAYSTATION®3, http://research.scee.net/presentations
[Tovey] Steven J. Tovey, Stephen McAuley, “Parallelized Light Pre-Pass Rendering with
the Cell Broadband EngineTM”, to appear in GPU Pro
[Thibieroz04] Nick Thibieroz, “Deferred Shading with Multiple-Render-Targets,” pp. 251 – 269, ShaderX2
[Thibieroz] Nick Thibieroz, “Deferred Shading with Multisampling Anti-Aliasing in DirectX 10” , ShaderX7
[Valient] Michael Valient, “Deferred Rendering in Killzone 2,” www.guerillagames.com/publications/dr_kz2_rsx_dev07.pdf
[Wolfgang Engel] Wolfgang Engel, Light Pre-Pass Deferred Lighting: Latest Development- August 3rd, 2009
[김대일] 웹젠 Rendering C9 kgc2009
[이창희] Kasa Light-Pre-Pass 2009-07-04
[박민근] 네이버 초중급 게임 개발자 스터디 [데브루키] Deferred Shading (지연 세이딩)
[오즈라엘님 블로그] http://ozlael.egloos.com/2374651
[오즈라엘님 블로그] http://ozlael.egloos.com/2876211
Z-culling http://codevania.springnote.com/pages/3936893.xhtml
Compact Normal Storage for small G-Buffers http://aras-p.info/texts/CompactNormalStorage.html