Deferred Shading

Dev.Write 2011. 3. 28. 12:36 Posted by zetz
Wikipedia
http://en.wikipedia.org/wiki/Deferred_shading

컴퓨터 그래픽스에서 지연 세이딩이란 다음과 같은  3차원 세이딩 기법이다.  작은 부분으로 나눠진 세이딩 알고리즘에 의한 결과를 색상 프레임 버퍼에 즉시 기록하는 대신에 나중에 조합하기 위해 중간 버퍼 저장소에 기록한다. 현대 하드웨어에서는  불필요한 정점 이동을 피하기 위해 멀티플 렌더 타겟(MRT)을 사용하여 구현하곤 한다. 일반적으로 한번에 모든 요구되는 버퍼들은 세이딩 알고리즘에서 읽고, 마지막 결과를 생산하기위해 조합하는데 사용된다. 이러한 방식으로 음영 처리하는 데 필요한 계산과 메모리 ​​대역폭이 장면에 따라서 음영처리된 깊이의 복잡성을 줄이고, 그 표시 부분이 줄어든다.

이점

지연 렌더링의 주요 이점은 거친(?) Z-Buffer와 빠른 Z-Buffer testing 의 가능성에 의해 부분적으로 완화되었다. 하지만 다른 이점들도 여전히  주장되고 있다.
이러한 장점들은 복잡한 조명 자원들의 간단한 관리, 다른 복잡한 세이더 자원의 쉬운 관리, 소프트웨어 렌더링 파이프라인의 단순화를 포함할 수있다.
이것은 소프트웨어 개발자들의 개발 과정과 끝없는 논의과정에서의 결정에서 미미한 장점이다.
지연된 쉐이딩의 구체적인 사용이 지연된 조명입니다.
렌더 타겟, 이하 G-Buffer(Geometry 의 G) 에 조명 세이더에 대한 다양한 파라메터를 저장한다.
정보를 저장하는 공통된 예제들은 색상, 노말, 위치이긴 하지만 이것(G-buffer)은  이론상 조명 단계에서 요구되는 어떠한 데이터라도 담을수 있다.
부동 소수점 형식을 대부분 사용하고,  MRT을 사용하기 때문에, 메모리 대역폭이 Forward-렌더링 기법보다 높다.
현대 그래픽 하드웨어는 메모리 접근보다 빠르게 수학 연산을 수행한다.
사실,  수학과 메모리의  성능은 미래의 하드웨어에서 더욱 편향 될 것이 예상되는 가운데, 지연 라이팅은 장기적인 해결책이 될 수 없음을 나타낸다.


단점

Deferred Rendering 의 중요 단점은 알고리즘상 투명도 처리가 불가능하다는 것이다. 비록 이 문제는 Z-Buffer 장면들 중 어느 하나이지만,  그리고 이것은 장면의 투명한 부분을 렌더링 하는데 있어 지연과 정렬하여 처리하려는 경향이있다.
Depth peeling이 지연 렌더링에서 순서 독립적인 투명성을 달성하는데 사용할 수 있지만 추가적인 배치와 G-버퍼크기를 소모한다.
현대 하드웨어(DirectX10 또는 그이상) 은 상호작용하는 프레임 레이트를 충분히 빠르게 유지하며 처리 할 수 있는 능력이 있다.
순서 독립적인 투명도가 요구된 디퍼드세이딩은  같은 기술을 사용하는 전방 세이딩 보다 더 비효율적이다.

또다른 중요한 단점은 다음과 같다.
Geometric Stage에서 Lighting Stage 를 분할하기 때문에 하드웨어 안티 -앨리어싱은 어떠한 적절한 결과도 처리 하지 못한다  : 비록 첫 번째 패스가  기본 속성(diffuse, normal etc.. )을 랜더링 할 때 안티-앨리어싱을 사용할 수 있지만, 이것은 안티-앨리어싱이 적용된 완전한 조명이 아니다.
이러한 제한점을 극복하기위한 일반적인 기술중 하나는 마지막 이미지에 엣지 디텍트를 사용하는 것과, 엣지에 블러를 적용하는 것이다.[2]
DirectX10 은 소개된  (multisampled render targets)(그리고 버전 10.1의 깊이 버퍼) 의 개별적인 샘플에 접근하기 위한 세이더에 따르면,  디퍼스 세이딩에서 하드웨어 안티-앨리어싱을 만드는 것이 가능하다.
이러한 기능은 또한 안티-앨리어스된 엣지들에 HDR 휘도 매핑을 정확하게 적용하는 것을 가능하게 만든다. 예전의 하드웨어에서 안티-앨리어싱의 어떠한 이점도 잃어버릴수 있고, 어떠한 경우에서 바람직한 안티-앨리어싱 형식을 만든다.

Code Sampler
http://www.codesampler.com/usersrc/usersrc_7.htm

본 샘플은 어떻게 디퍼드 세이딩을 다이렉트X 9로 구현하는지 보여준다. 디퍼드 세이딩의 아이디어는 새로운 것이 아니다.  1988년 시그라프에서 Michael Deering에 의해 처음으로 소개되었다. 이론은 간단하다. Position, Normals, Diffuse Map, Environment Map 등과 같은 모든 기하 정보를 Multiple Render Target 에 렌더링하고, PostProcess로 조명을 나중에 적용한다.
조명이 계산되는 동안 Multiple Render Target는 이전에 저장된 데이터를 읽고 전체 화면을 덮는 평면에 최종 색상을 렌더링 하는데 사용된다.
Deferred Shading 기법이 몇 가지 최적화을 제공하지만, 또한 몇 가지 단점이 있다.
Deferred Shading이 고성능의 GPU를 필요로 하는반면, 이것들은 오래된 하드웨어와 호환성이 없으며, 완전히 구분된 렌더링이 사용됩니다.
다양한 장점 / 단점에 대한 세부 정보는 나중에 코드에서 언급하고 있습니다.


개인 적인 결론

이점 :
동적 라이팅 처리에 유리(GDC2011의 UDK 샘플에서 이점을 특히 강조)
셀프 세도우등 그림자 처리에 유리(특별히 그리자 처리가 필요치 않다.)
그래픽 퀄리티에 크게 영향을 미친다고 함.

단점:
투명한 물체 표현의 한계점
MSAA 지원 불가(하드웨어 안티-앨리어싱을 사용하면 안된다.) -> "엣지 디텍트 AND 블러" 로 처리 가능





'Dev.Write' 카테고리의 다른 글

SetUnhandledExceptionFilter 함수 사용시 주의사항!  (1) 2011.04.11
Custom RTTI  (0) 2011.04.04
Tutorial04  (0) 2011.03.27
Tutorial03  (0) 2011.03.27
Tutorial02  (0) 2011.03.27