850 likes | 1.5k Views
Deferred Shading ( 지연 세이딩 ). 박민근 ( 알콜코더 ) 네이버 초중급 게임 개발자 스터디 [ 데브루키 ] 2011.03.26. Real-Time Rendering. 최근 게임들은 수 많은 라이트와 수많은 오브젝트 들이 등장한다 . -> 라이팅 계산양의 증가. 리얼 타임 라이팅을 위한 세가지 주요 기법. 포워드 렌더링 (Forward Rendering) Single-pass, Multi-light Multi-pass, Multi-light 디퍼드 렌더링
E N D
Deferred Shading (지연 세이딩) 박민근(알콜코더) 네이버초중급 게임 개발자 스터디[데브루키] 2011.03.26
Real-Time Rendering • 최근 게임들은 수 많은 라이트와 • 수많은 오브젝트 들이 등장한다. • -> 라이팅 계산양의 증가
리얼 타임 라이팅을 위한 세가지 주요 기법 • 포워드 렌더링(Forward Rendering) • Single-pass, Multi-light • Multi-pass, Multi-light • 디퍼드렌더링 • Deferred Shading
Single-pass, multi-light • for each object do • for each light do • framebuffer= light_model(object,light);
Single-pass, multi-light • 화면에 렌더딩 되지 않을 면도 셰이딩 연상을 해야만 한다. • 멀티 라이트 상황에서 관리가 어렵다 • 싱글 템플릿 셰이더에서 수천 가지의 조합의 코드가 생성될 수 있다. • 그림자와의 통합이 어렵다
Single-pass, multi-light • 1억 개의 오브젝트, 50개의 라이트 • [라이팅만을 위한 계산양] • 1억 * 50
Multi-pass, multi-light • for each light do • for each object affected by light do • framebuffer+= light_model(object,light);
Multi-pass, multi-light • 화면에 렌더딩 되지 않을 면도 셰이딩 연상을 해야만 한다. • 높은 배치 카운트 • 1/object/light • 각패스마다 중복된 작업이 많다. • Vertex Transform & setup • Anisotropic filtering
Multi-pass, multi-light • 1억 개의 오브젝트, 50개의 라이트 • [라이팅만을 위한 계산양] • 50 * 라이트의 영향을 받는 오브젝트 개수
Deferred Shading • for each objectdo • G-buffer= lighting properties of object; • for each light do • framebuffer+= light_model(G-buffer,light);
Deferred Shading • 굉장히 배치가 간단해지고, 엔진에서 관리가 쉽다 • 일반적인 그림자 테크닉들과 통합이 쉽다 • 라이팅을 위한 계산이 “완전한” O(1) 복잡도를 가진다. • 오브젝트의 개수와 상관없다 • 수많은 작은 동적 라이팅 사용이 가능하다
Deferred Shading • 1억 개의 오브젝트, 50개의 라이트 • [라이팅만을 위한 계산양] • 라이트 개수 * 라이트에영향받는 픽셀 개수
Deferred Shading • 일종의 포스트 프로세싱처럼 수행된다 • 2D 렌더타겟간의 계산이다. • 3D 계산을 -> 2D 계산으로 변환 시킨다. • 오브젝트는 라이팅 계산이 전혀 없이 속성만을 렌더링 한다. • 화면에 실제로 렌더링 되는 픽셀만 라이팅 계산을 수행한다.
Deferred Shading • 라이팅 계산을 먼저 하지 않고, 미루어 두었다가 • 실행하기 때문에 지연(Deferred) 셰이딩 • 이라고 불리운다.
Deferred Shading • 이미 1988년의 시그래프 논문에서 이 기법이 소개 되었다. • 그때는 Deferred 라는 용어는 사용하지 않았다. • 그래픽 카드의 발달으로 이젠 실시간에 사용 가능!!
요구 조건 • MRT(Multi Render Target)을 기본적으로 4장 이상 사용한다 • DirectX 9 이상 • 지포스6800 이상 • ShaderModel 3.0 이상 • 위 조건이면 사용 가능 • 현재의 그래픽 카드로는 당연히!! 전부 지원 가능
실장된 엔진들 CryEngine 3 기타등등…
샘플 동영상 • Unity 엔진 – Deferred Rendering
샘플 동영상 • UDK(언리얼) - Samaritan
디퍼드렌더링 구현 방법
G-Buffer란? • Geometry Buffer • Per-pixel 라이팅에 필요한 모든 정보 • Normal • Position • Deffuse / Specular Albedo, Other Attributes
지오메트리 패스 (G버퍼 작성)
지오메트리 패스 • 3D 공간의 지오메트리(오브젝트) 데이터의 속성값들을G-Buffer에 렌더링 하는 단계 • 라이팅 처리는 하지 않는다! • MRT(Multi Render Target)을 사용해서, 한 패스에 4개의 렌더타겟에 정보를 렌더링 한다. • Depth • Normal • Diffuse / Specular
2. 라이팅 패스 (픽셸셰이딩)
라이팅 패스 • 라이팅을지오메트리 형태로 렌더링된다. • Point Light = Sphere • Spot Light = cone • Sun = full Screen Quad
라이팅 패스 • 각각의 라이팅에 대해서 • 라이팅에 영향을 받는 픽셀을 찾아내서 체크한다. • 만약 라이팅이 스크린에 영향을 준다면… • Render Shadow Map • 라이팅 픽셀을 셰이딩하고FrameBuffer에 추가한다.
라이팅 패스 • 각 라이팅에 영향을 받는 픽셀들의 계산 결과를 누적(accumlation) 버퍼에 블렌딩 한다. • Diffuse 값과, Specular 값은 별도로 저장한다. For each light: diffuse += diffuse(G-buff.N, L)) specular += G-buff.spec* specular(G-buff.N, G-buff.P, L)