|
요즘 ShaderX7 을 읽고 있는데 2009년 가장 최신판인 만큼 난이도가 아주 높고, 내용도 매우 충격적으로 훌륭합니다. 거의 최신 기술들을 전부 망라해 놓은 듯한 느낌이 들어서 상당히 재미있게 읽고 있습니다.
이번 7판에서 가장 흥미로운 점은 deferred shading 의 문제점을 개선한 pre-light rendering 이라는 방법이 제안되었다는 점입니다. ![]() 책의 핵심 편집자이자 RockStar 에서 연구하고 계시는 Engel 아저씨의 말에 따르면 GTA4 에서 이 pre-light rendering 이라는것이 이미 사용되고 있다고 합니다. 우선 deferred shading 의 문제점을 살펴보면, G-Buffer 라는 (geometric buffer) 것을 생성하는 과정에서 MRT (Multiple Render Target) 라는 기능이 하드웨어적으로 지원이 안되면 deferred shading 을 사용할수 없다는 제약이 있고, 사용할수 있게 된다고 하더라도 MRT 로 사용할수 있는 텍스쳐의 량을 무한으로 증가 시킬수 없기 떄문에 (보통 최대 4장) 나중에 lighting 할때 사용할수 있는 material 에 대한 정보가 제한될수 밖에 없습니다. 그리고 MSAA (Multisampling Anti-Aliasing) 기능을 사용할수 없다는 큰 문제점도 있습니다. 결정적으로 deferred shading 의 가장 치명적인 문제점은 투명한 물체 표현이 매우 매우 어렵다는 점입니다. ShaderX7 에 있는 글들을 읽어보면 위에서 언급한 대부분의 문제점들은 DirectX 10 이상에서 해결이 가능하다고 합니다만, 여전히 투명한 물체 표현은 depth peeling 같은 느린 연산을 사용해야 한다고 하고, 그리고 근본적으로 deferred shading 은 G-Buffer 의 사이즈가 너무 커서 shader programming 에서 가장 중요한 bandwidth 를 너무 많이 잡아 먹는다는 문제가 여전히 남게 되겠습니다. 여기에 pre-light rendering 을 사용하면 위에 언급된 문제점들이 모두 해결됩니다. 기본 아이디어는 deferred shading 의 기본 아이디어를 반대로 하는 것입니다. 즉, deferred shading 에서는 geometry 정보를 먼저 사용해서 G-Buffer 를 작성하지만 pre-light rendering 방식에서는 lighting 을 먼저 계산하고 뒤이어서 geometry 한개 한개씩을 그려줄때에는 이미 계산된 빛의 강도값을 사용해서 그려주는 방식입니다. pre-light rendering 은 우선 MRT 를 필수로 요구하지 않습니다. (성능 향상을 위해 MRT 를 활용할수는 있습니다) 그리고 기본적으로 MSAA 의 지원을 받을수 있습니다. 그리고 G-Buffer 같은 무거운 버퍼를 가지는 것이 아니기 때문에 material 사용을 훨씬더 자유롭게 할수 있습니다. 그리고 light buffer 를 구성하는 방법에 따라 투명한 물체 표현도 상당히 간단하게 해결될수 있고, 그림자 문제도 deferred shading 에서 하는 방식을 그대로 사용해서 간단히 해결할수 있습니다. 이렇게 보면 pre-light rendering 은 deferred shading 을 완전히 대체 할수 있는 새로운 방법으로 보입니다. 확실히 저는 그런 느낌이 듭니다. 그런데 pre-light rendering 도 문제점은 있는데, 제가 볼때는 두가지가 대표적인 문제점입니다. 첫번째는 deferred shading 이 geometry 정보를 한번만 그리는 것에 반해서 pre-light rendering 을 사용하면 처음에 depth buffer 를 체워주기 위해서 한번 그리고 나중에 material 사용해서 빛량을 계산할때 또 한번 그려줘야 합니다. 사실 depth buffer 만 체우는거는 상대적으로 빠르고, depth buffer 체우기의 특성상 카메라에 가까운것부터 먼것 순서로 그리게 되면 하드웨어 occlusion culling 효과가 있어서 비용이 그리 많이 들지 않습니다. 두번째 문제는 사용할수 있는 빛의 종류를 다양하게 늘리는데 한계가 있어 보입니다. 이 문제는 조만간 개선 방법이 나올걸로 확신됩니다만, 당분간은 누군가가 해결할때 까지 기다려야 할것 같습니다. 쉽게 말해서 pre-light rendering 에서는 빛의 종류를 directional 이나 point light 나 spot light 중의 한가지만 사용할수 있습니다. 두개 이상 동시에 사용하려고 하는 경우, 가능은 한데 pixel shader 코드가 복잡해집니다. 그리고 아직 두가지 이상의 빛 종류를 동시에 사용하는 걸 구현한 pixel shader 가 없습니다. ![]() http://code.google.com/p/lightindexed-deferredrender/ 위의 주소에 보면 한번에 255개의 빛이 동시에 사용된 것을 볼수 있습니다. 그러면서도 사용된 텍스쳐의 량은 기존의 표준 deferred shading 의 절반정도 밖에 되지 않고 훨씬 빠릅니다. Engel 의 글에 따르면 deferred shading 이 3.5ms 걸릴때 pre-light rendering 은 0.7ms 걸린다고 하는군요. 아무튼 책을 계속 읽고 있는데, 최신 기술들이 마구 마구 쏟아져 나와서 머릿속으로 소화하느라 고생중입니다. 책은 정말 좋아서 벌써 레벨 1 업하고도 남는 기분입니다. | ||||