002.jpg

 

마이크로소프트는 NVIDIA 지포스 GTX 900 시리즈의 기술 설명회에서 다이렉트 X 11.3의 등장을 예고했습니다. 그 동안 다음 다이렉트 X는 12 아니었을까 생각한 분들도 있을 것입니다. 갑자기 등장했다는 느낌이 강한 다이렉트 X 11.3은 도대체 무엇일까요. 기능이나 스펙이 완전히 드러난 건 아니지만 일부 공개된 내용을 소개하고자 합니다.

 

 

다이렉트 X 11.3이란? 다이렉트 X 12와의 연관성은?


다이렉트 X 11.3을 말하기 전에 2014년 10월 시점에서 다이렉트 X 의 상황을 기본적으로 정리해 봅시다. 발단은 올해 Game Developers Conference 2014(이하 GDC 2014)에서  차세대 다이렉트 X로 다이렉트 X 12를 발표했던 것입니다.


GDC 2014에서 발표했던 다이렉트 X 12의 내용은 http://gigglehd.com/zbxe/11291446 여기에 설명했지만, 간단히 설명하면 다이렉트 X 12는 1990년대부터 수정을 거듭해 온 다이렉트 X 아키텍처의 두터운 추상화 레이어를 얇게 만들어 하드웨어를 직접적으로 구동할 수 있게 됩니다. AMD가 2013년에 발표한 맨틀과 2014년에 애플이 발표한 메탈과 컨셉이 가깝습니다. 혹은 PS4나 Xbox One 등의 콘솔 게임기 프로그래밍 모델에 다가섰다는 인식도 틀린 건 아닙니다.

 

다이렉트 X 12의 정식 발표는 2015년 예정이며 윈도우 10과 비슷한 시기에 나올 것으로 알려졌습니다. 지원하는 운영체제는 윈도우 7 이후입니다.

 

아래 동영상은 다이렉트 X 12 베타 버전의 런타임을 쓴 페이블 레전드의 기술 데모.

 

 

003.jpg

 

Max Mcmullen(Direct3D Development Lead, Microsoft)

 

이렇게 마이크로소프트가 다이렉트 X 12를 준비중인데 왜 이제서 다이렉트 X 11.3이 나왔을까, 이걸 궁금하게 여기는 사람이 많을 것입니다.

 

NVIDIA 행사에는 마이크로소프트에서 다이렉트 X(다이렉트 3D)의 실질적인 개발 리더를 맡은 Max McMullen가 올라 다이렉트 X 11.3을 예고했습니다. 직접 물어보니 나온 대답은 "당분간 다이렉트 X 11 시리즈와 다이렉트 X 12는 공존하기 때문"이란 답이 돌아왔습니다. 다음 윈도우인 윈도우 10에서도 이러한 공존은 변하지 않는다는 것입니다.


McMullen의 설명에 의하면 그래픽 렌더링에 관련된 기능의 경우 다이렉트 X 11.3과 다이렉트 X 12가 같은 수준이라고 합니다. 요컨데 다이렉트 X 11.3의 새 요소는 기본적으로 다이렉트 X 12에도 들어간다는 것입니다.

 

그럼 두 가지를 공존시켜야 하는 이유는 어디에 있을까요? 맞는 말입니다. 허나 곰곰히 생각해 보면 두가지가 공존하는 것이 자연스러운 일이라고 생각이 들기도 할 것입니다.

 

004.jpg

 

앞서 말한대로 다이렉트 X 12는 추상화 레이어를 매우 얇게 만들어 GPU라는 하드웨어를 꽤 가까운 거리에서 구동할 수 있도록 하는 API인데, 커맨드 버퍼를 비롯한 각종 버퍼나 그 외 다양한 리소스는 애플리케이션 쪽(소프트웨어 개발자)에서 관리할 필요가 있습니다. 그래픽 렌더링의 경우 다이렉트 X 12에서 도입된 Pipeline State Object의 구조 등은 GPU 렌더링 파이프라인을 깊이 이해하지 않으면 다루기가 상당히 어렵습니다.

 

반면 다이렉트 X 11.3은 기존부터 이어진 다이렉트 X 11 시리즈를 업데이트한 것으로 기존 다이렉트 X 프로그래밍 양식을 쓸 수 있는 API입니다. 리소스 관리도 어느 정도는 다이렉트 X에서 하기에 GPU에 대한 이해가 그리 깊지 않아도 다이렉트 X 12보다는 쉽게 그래픽 렌더링을 할 수 있습니다. 기존 다이렉트 X에서 제공했던 실시간 성능에 불만을 느끼지 않았던 개발자-구체적으로는 동영상이나 사진 관련 애플리케이션-들은 다이렉트 X 12보다 다이렉트 X 11.3이 훨씬 쉬울 것입니다.

 

어떤 의미에서 다이렉트 X 11.3은 그동안의 다이렉트 X 애플리케이션을 위해 호환성을 배려한 API란 것입니다. 이렇게 성격이 다르기에 마이크로소프트는 다이렉트 X 11 시리즈와 다이렉트 X 12를 같이 내놓기로 한 것이라 생각됩니다.

 

 

다이렉트 X 11.3의 새로운 기능 1. ROV는 순서대로 렌더링과 반투명 렌더링을 실현

 

이상을 감안하면서 다이렉트 X 11.3의 새 요소를 보도록 합시다.

 

첫번째는 Raster Ordered View(ROV)입니다. ROV는 다이렉트 X 11.0에서 탑재돼 다이렉트 X 11.1에서 크게 기능이 확장된 Unordered Access View(UAV)의 확장 스펙에 해당되며, 라스터라이즈 처리를 이용해 한 화면의 좌표로 이루어진 픽셀의 그림자 처리에 쓰이는 픽셀 쉐이더의 처리 순서를 정하는 것입니다.

 

005.jpg

 

ROV는 다이렉트 X 11의 새로운 기능으로 UAV의 확장 기능에 해당됩니다.

 

UAV는 버텔스 쉐이더, 지오메트리 쉐이더, 헐 쉐이더, 도메인 쉐이더, 픽셀 쉐이더, 컴퓨트 쉐이더 모두에서 쓸 수 있는 특정 버퍼의 랜덤 액세스 기능과 같다고 볼 수 있습니다.

 

다이렉트 X 11.0에서 UAV는 픽셀 쉐이더 1슬롯(1버퍼), 컴퓨트 쉐이더 8슬롯 분량만 사용할 수 있었습니다. 그것이 다이렉트 X 11.1에서는 UAV가 픽셀 쉐이더와 컴퓨트 쉐이더 이외에 버텍스 쉐이더, 지오메트리 쉐이더, 헐 쉐이더, 도메인 쉐이더에서도 쓸 수 있도록 확장돼 64슬롯 만큼 사용이 가능해졌습니다. 그리고 다이렉트 X 11.3에선 ROV가 추가됐습니다.


그런 ROV의 주요 활용처는 반투명 오브젝트의 렌더링이라 합니다. 반투명 오브젝트는 주로 폭연, 폭염, 선광 등의 이펙트를 그려낼 때 자주 씁니다. 이러한 반투명 오브젝트는 이름 그대로 뒤에 있는 게 비춰 보이지만, 거듭해서 겹칠수록 투명도는 줄어듭니다. 그래서 시점에서 보는 것보다 더욱 안쪽의 반투명 오브젝트에서 렌더링하지 않으면 반투명 오브젝트 너머에 비춰 보이는 걸 물리적으로 제대로 그리기가 어려워집니다.

 

006.jpg

 

반투명 오브젝트의 렌더링을 선글라스에 비유한 것. 안경테 부분은 렌즈 너머에 있어야 합니다. 기존에는 렌더링 순서에 주의하지 않으면 안경테가 렌즈 앞에 오도록 그려질 수도 있었습니다.

 

바위나 벽 같은 불투명한 물체의 경우 심도 버퍼의 구조가 있기에 가려져 보이지 않는 부분은 픽셀 단위로 렌더링이 취소됩니다. 그래서 순서를 따지지 않고 렌더링해도 별 문제가 안 되지만 반투명 오브젝트를 같은 방법으로 그려내면 나중에 그릴수록 투명도가 높아진다는 이상한 사사태가 발생하게 됩니다.

 

그래서 지금의 렌더링 파이프 라인에는 일반적으로 반투명 오브젝트를 렌더링할 때, 시점의 위치에서 봤을 때 안쪽에서 바깥쪽으로 가도록 순서를 정해 렌더링합니다. 다만 이것은 CPU에서 오브젝트 단위로 이루어질 필요가 있으며 부하가 비교적 높기에 처음부터 반투명 오브젝트 표현의 정확성을 포기하는 게임도 많습니다.

 

반면 다이렉트 X 11.3의 ROV는 GPU에서 픽셀의 심도를 이용하 앞뒤 관계를 판정하고 픽셀 단위로 전후 관계를 그려내게 됩니다. 만약 거의 같은 좌표에 위치하며 다수의 반투명 캐릭터 모델이 둘러싸 있다 해도 각각의 모델을 구성하는 반투명 픽셀의 전화 관계를 판정해 렌더링합니다.

 

좀 추상적인 이야기지만 아래 슬라이드를 보면서 설명을 하지요. 여기에선 하늘색의 E자형 반투명 오브젝트를 그렸는데, 뷰포인트는 실제로 화면에 표시되는 것이라고 가정해 봅시다. ㄷ자의 렌더링 스레드가 GPU에서 실행됐을 때 화면의 붉은 픽셀을 대상으로 픽셀 쉐이더가 실행됩니다. 뒤쪽은 스레드 A, 앞쪽이 스레드 B입니다.

 

007.jpg

 

반투명 오브젝트의 렌더링. 안쪽이 스레드 A, 앞쪽이 스레드 B입니다.

 

스레드 A의 렌더링과 스레드 B의 렌더링과 GPU에서 서로 다른 쉐이더 프로세서로 수행되기에 누가 메모리를 먼저 읽고 쓰여지는지를 게임 프로그램에서 예측할 수 있습니다. 이는 GPU 부하 조건에 의존하는 것이기 때문입니다. 

 

008.jpg

 

스레드 A, B의 실행 순서를 게임 프로그램 측은 예측할 수 없습니다. 이 예를 보면 uav[0]의 값은 1, 2, 3 중 그 어떤 것일 수도 있습니다.

 

간단히 말하면 이 스레드 A와 스레드 B의 실행 순서를 프로그램(=C) 할 수 있는 것이 ROV입니다. ROV를 통해 동일 좌표의 안쪽에 있는 픽쉘 쉐이더를 먼저 실행하도록 설정하면 스레드 A가 반드시 먼저 실행되며 그것이 끝난 후에 스레드 B가 실행되도록 할 수 있습니다. CPU에서 순서를 정렬하지 않아도 GPU가 안쪽부터 차례로 반투명 오브젝트를 렌더링할 수 있게 되는 것입니다.

 

009.jpg

 

ROV는 픽셀 좌표를 기준으로 UAV의 처리 순서를 정할 수 있는 기능입니다.

 

010.jpg

 

뒤쪽에 있는 스레드 A를 먼저 처리하도록 하면 uav[0]의 값은 반드시 3이 됩니다.

 

안타깝게도 자세한 스펙은 공개되지 않았지만 마이크로소프트는 이 ROV의 구조가 반투명 오브젝트의 렌더링 뿐만 아니라 복잡한 알고리즘을 구사한 버퍼 간의 혼합 처리(비선형과 이방성의 합성 처리), 안티 앨리어싱 처리에도 유용할 것이라 보고 있습니다.


GDC 2014에서 다이렉트 X 12를 발표했을 때 새 기능으로 '다른 순서의 반투명 렌더링'이나 '프로그래머블 혼합'등의 기능을 예고했던 적이 있는데 바로 그 실체가 이 ROV일 수도 있겠습니다.

 

 

다이렉트 X 11.3의 새로운 기능 2. Typed UAV Load로 UAV를 더 쉽게

 

두번째는 역시 UAV에 관련한 확장 기능인 Typed UAV Load입니다. 다이렉트 X 11.2까지 UAV에 의한 데이터 액세스는 32비트 싱글채널로 한정돼 있었습니다. 원래 GPGPU용으로 탄생한 UAV이기에 αRGB 형식으로 표시되는 같은 픽셀 데이터를 불러오는 건 지원하지 않은 셈입니다.

 

거꾸로 말하면 UAV를 그래픽용으로 쓸 경우 일단 32비트 싱글 채널로 데이터를 읽어와서 직접 소프트웨어 처리를 하고 필요한 데이터를 분해해하며, 처리를 마치고 데이터를 쓰기 반환할 때엔 역시 소프트웨어 처리로 32비트 싱글 채널 데이터로 만들어야 했습니다. 즉 Unpack과 Pack이 필요한 것이니 매우 복잡한 처리계통이라 할 수 있습니다. 이 경우 쉐이더 프로그램이 지나치게 길어지니 좋을 게 없습니다.

 

위에서 소개한 ROV의 추가도 있다보니 앞으로는 그래픽용으로 UAV를 쓰는 것도 진행될 것으로 보입니다. 그래서 다이렉트 X 11.3에선 버텍스 쉐이더와 픽셀 쉐이더로 대표되는 그래픽 전용 데이터를 읽어오거나 되돌리는 것도 가능해집니다. 이것이 Typed UAV Load 기능의 정체입니다.


현실적으로는 그래픽용 데이터 포맷 뿐만 아니라 각종 프로그래머블 쉐이더에서 지원하는 다양한 데이터 포맷을 지원할 예정입니다. 애플리케이션 개발자가 자체 소프트웨어 처리를 하고 Unpack과 Pack을 실시할 필요가 이제 없어진다는 것입니다.

 

011.jpg

 

Typed UAV Load는 ROV와 같이 사용할 수도 있습니다. UAV를 그래픽용으로도 적극적으로 활용해 가속하는 것이 가능합니다.

 

 

다이렉트 X 11.3의 새로운 기능 3. 볼륨 텍스처를 지원하는 Volume Tiled Resources

 

다이렉트 X 11.2의 핵심 기능 중 하나로 Tiled Resources가 있습니다. 이 개념 자체는 라데온 R9 290의 아키텍처를 해설했을 때 소개했는데(http://gigglehd.com/zbxe/10686657) 다시 한번 간단히 소개하면 텍스처 맵을 CPU에서 쓰는 것처럼 가상 메모리로 활용할 수 있는 기능입니다. 구체적으로는 그래픽 메모리에 들어가지 않는 용량의 방대한 텍스처 맵을 MIP-MAP(멀리 있는 것을 그리는 데 쓰는 저해상도 텍스처)으로 용량 64KB의 타일(가상 메모리의 단위 페이지 크기)로 관리합니다. 이렇게 하면 특정 장면을 그려낼 때 필요한 만큼 불러내 이용할 수 있게 됩니다.

 

012.jpg

 

다이렉트 X 11.2에서 채택된 타일 리소스(Tiled Resources)는 2D 텍스처의 가상 메모리화를 하드웨어 가속할 수 있다는 점에서 획기적입니다. 이제 PS4나 Xbox One에서도 쓸 수 있는 평범한 기능이 됐네요.

 

다이렉트 X 11.2까지, 이 타일 리소스는 2D 텍스처에 한정돼 있었습니다. 그것이 다이렉트 X 11.3에선 볼륨 텍스처를 지원하게 된 것이 큰 특징입니다. 그렇게 되면서 이름도 Volume Tiled Resources가 됐습니다.


최근 3D 게임 그래픽은 볼륨 텍스처의 이용이 활발해지고 있습니다. 장면의 직접 조명 결과를 복쉘화한 데이터 구조로 저장해 여기에 복셀 콘 트레이싱을 글로벌 일루미네이션을 넣는 방법은 NVIDIA도 VoXel Global Illumination(GI Works라고도 부름)란 이름으로 제공하기에 기억하고 있는 사람도 있을 것입니다(http://gigglehd.com/zbxe/11852207).

 

바로 이 Volume Tiled Resorces기능을 활용하면 광대한 장면의 복셀을 효율적으로 관리하고 실행할 수 있습니다.

 

013.jpg

 

Tiled Resources을 볼륨 텍스처에 대응시킨 Volume Tiled Resources입니다. Sponza Atrium 모델을 이용한 NVIDIA의 간접 조명 데모에선 한 변에 2cm의 볼룸으로 장면을 복셀화했을 때 메모리 사용량은 1.6GB였으나, Volume Tiled Resources에서 복셀을 타일화해서 빈 복셀을 정리한 결과 약 1/10인 156MB의 메모리만 쓰는 것으로 끝났다고 합니다.

 

 

다이렉트 X 11.3의 새로운 기능 4. 조금이라도 픽셀에 걸리면 라스터라이즈하는 Conservative Rasterization

 

Dynamic Super Resolution(DSR)의 해설 기사(http://gigglehd.com/zbxe/11999777)에서 언급한대로 현재의 렌더링 파이프 라인에는 폴리곤을 픽셀의 집합체로 분해할 때, 픽셀에 있는 샘플 포인트에 폴리곤이 겹쳐 있는지를 판단해 픽셀이 있고 없는지를 정합니다. 그 샘플 포인트의 위치는 GPU마다 다르며, 샘플 포인트의 수나 안티 엘리어싱의 설정 포인트에 따라 다르기도 합니다.

미세한 폴리곤은 샘플 포인트와 엇갈리지 않는 것도 있지만, 샘플 포인트와 엇갈리지 않은 폴리곤이라 해도 시간이 지나고 이동하면서 특정 시점에는 갑자기 엇갈리는 경우도 있습니다.

 

샘플 포인트와 엇갈리지 않는 경우 해당 픽셀은 없는 것으로 취급해 픽셀 쉐이더가 실행되지 않아 그려지지도 않습니다. 그럼 지금 말한 상황에선 라스터라이저에 따라 픽셀화되거나 혹은 픽셀화되지 않아, 시간이 흐를 때마다 나타나거나 사라지는 것을 되풀이하는 픽셀이 있습니다. 이는 픽셀이 깜빡거리는 현상으로 나타나며 Pixel Crawling이나 Pixel Shimmer란 이름으로 불립니다.

 

픽셀에서 그려지는 그래픽의 경우 DSR 같은 방법을 써서 그런 깜빡거림을 줄일 순 있지만 직접적인 그래픽 렌더링용은 라스터의 색다른 활용이 되며, 픽셀의 샘플 포인트와 엇갈렸을 때 픽셀화하는 기존의 라스터라이즈 알고리즘은 불편한 점이 있습니다. 그런 불편함의 대표가 바로 복셀화(Voxelization)입니다.

 

014.jpg

 

지오메트리 쉐이더를 사용한 3D 형태의 복셀화 알고리즘의 예시

 

현재의 GPU의 렌더링 파이프 라인에서 폴리곤으로 구성된 3D 오브젝트를 복셀화할 때는 위 그림처럼 지오메트리 쉐이더를 할용해 3D 오브젝트를 구성하는 각각의 폴리곤을 X/Y 평면, X/Z 평면, Y/Z 평면에 투사해 라스터라이즈를 실시합니다.


다만 이 복셀 구조를 VXGI 같은 글로벌 일루미네이션용 관리 데이터 구조에 응용할 때 라스터라이즈의 샘플 포인트를 제대로 가져오지 못하게 되면 문제가 생갑니다.

 

좀 더 구체적으로 봅시다. 간접 광선에 의한 조명의 연산은 직접 광원에 의한 라이팅 결과를 복셀 구조 데이터에 저장해 두고, 뒤쪽에 있는 Voxel Cone Tracing 등의 처리에서 해당 복셀 내부에 저장된 직접 광원에 의한 라이팅 결과를 회수하는 것으로 실현됩니다.


예를 들어 특정 장면에서 직사 광선을 받은 곳, 다시 말해 직접 조명으로 강렬한 휘도가 나온 곳이 있었다고 가정하고, 복셀화를 할 때 우연히 그곳이 샘플 포인트가 어긋나서 복셀화되지 않았다면 어떨까요. 그럼 직사 광선에 의한 조명 결과가 기록되지 않게 됩니다. 그 영역의 간접 광선은 어두워지겠지요. 즉 직접 조명의 렌더링 결과와 간접 광선의 처리 결과가 서로 맞지 않는 묘한 렌더링이 나오게 됩니다.

그래서 VXGI 같은 복셀화 구조 데이터를 응용하는 사례에서는 그러한 일이 없도록 조금이라도 픽셀 영역에 걸쳐져 있으면 라스터라이즈하는 Conservative Rasterization 알고리즘을 선택할 필요가 있습니다. 적어도 NVIDIA는 복셀화에 Conservative Rasterization이 유효하다고 생각합니다.

 

015.jpg

 

기존의 라스터라이제이션(왼쪽)과 Conservative Rasterization(오른쪽)의 비교. Conservative Rasterization에선 픽셀 영역에 조금이라도 대상 폴리곤이 걸려 있으면 픽셀이 있다고 판정합니다.

 

다이렉트 X 11.2 이전에는 이러한 처리 기법을 소프트웨어적으로 실현했기에 라스터라이즈 대상 폴리곤을 조금 확대하는 처리 계통이 필요했습니다. 위에서 본 처리 과정에도 그것이 나와 있지요. 반면 다이렉트 X 11.3에선 이 Conservative Rasterization을 하드웨어적으로 처리할 수 있게 된 것입니다.

 

Conservative Rasterization은 3D 적인 복셀 구조화뿐 아니라 2D적인 타일 구조 생성에도 응용할 수 있으며, 충돌 판정용 데이터의 제작이나 눈에 보이는 영역을 판정하고 물리 계통, AI에도 응용할 수 있습니다.

 

016.jpg

 

Conservative Rasterization은 그래픽 뿐만 아니라 물리 가속, AI까지 폭넓은 분야에서 응용할 수 있습니다.

 

 

다이렉트 X 11.3의 모든 모습이 보이는 건 GDC 2015?

 

여기서 소개한 4가지 기능은 어디까지나 현 시점에서 다이렉트 X 11.3에 쓰는 게 확정된 것으로 앞으로 다른 새 기능이 추가될 가능성이 높습니다.

 

덧붙여서 다이렉트 X 11.3의 새 기능이 NVIDIA의 새 GPU 발표 행사에서 드러났다는 점에서 생각할 수 있는 것인데, NVIDIA가 주도한 것일 가능성이 높습니다.


AMD가 9월에 개최한 인도의 이벤트에서 비주얼 컴퓨팅 부문 담당 부사장인 Raja Koduri는 다이렉트 X 11.3에 대해서 잘 알지 못한다고 답한 것도 저렇게 생각하게 만드는 한가지 이유이기도 합니다.

 

어쨌든 간에 2015년 봄에 열리는 GDC 2015에서는 다이렉트 X 11.3과 12의 새로운 보고가 있을 것이니 그때를 기다립시다.

 

소스: http://www.4gamer.net/games/033/G003329/20141020017/

기글하드웨어(http://gigglehd.com/zbxe)에 올라온 모든 뉴스와 정보 글은 다른 곳으로 퍼가실 때 작성자의 허락을 받아야 합니다. 번역한 뉴스와 정보 글을 작성자 동의 없이 무단 전재와 무단 수정하는 행위를 금지합니다.