"다이렉트 X 10 지원하는 그래픽카드 나오면 그때 업글하겠다"라고 말씀하시는 분들이 최근 상당히 늘어났음에도 불구하고, 정작 다이렉트 X 10이 지금의 다이렉트 X 9.0c하고 과연 뭐가 다른지는 잘 알려져 있지 않습니다. 따라서 나베르에서 다이렉트 X 10으로 검색해보면 낄낄뉴스의 포스트가 눈에 확 띄는 작금의 상황은, 결국 저로 하여금 수박 겉핥기 식으로라도 대충 다이렉트 X 10가 뭐인지 설명을 ?않으면 안될것 같은 근거불명의 책임의식을 조성하여, 결국 이런 글을 쓰게 된 것입니다... (다이렉트 X 10이라고 하지만 이 글에서 다루게 되는것은 오직 D3D(다이렉트 3D) 10입니다. 이 점은 지금 다이렉트 X 10에 관심을 갖는 분들 역시 마찬가지일 것입니다.) 앞으로 다이렉트 X 10이나 지원 그래픽카드가 출시되면 더 자세하고 확실하고 쉬?그런 글들이 나올 것입니다. 그때까지만이라도 이 글이 도움이 됐으면 합니다. (어째서 짤방이 나가토인가...? 이런 질문은 받지 않습니다) 쓸데없이 길고 복잡할 본론을 시작하기 전에... 다이렉트 X 9와 다이렉트 X 10의 근본적인 차이점을 확실하게 설명해줄 사진을 두장 소개하겠습니다. 이것은 마이크로소프트에서 개발중인 플라이트 시뮬레이터 X의 다이렉트 X 9.0c 버전 스샷입니다. 그리고, 아래는 역시 같은 게임의 같은 장면의 다이렉트 X 10 버전 스샷입니다.    만약 다이렉트 X 9 버전 스샷이 다이렉트 X 10 버전 스샷보다 더 좋아보인다고 생각하시는 분이시라면 아래 내용을 계속 보실 필요가 없으실 것입니다. 그리고 과연 무엇이 똑같은 게임의 똑같은 장면을 이렇게 바꿀수 있는가 궁금해하시는 분이시라면 아래 글을 읽으시면서 그 답을 직접 찾아보시기 바랍니다. 그동안 다이렉트 X 10은 이름이 WFG 같은걸로 바뀐적이 있습니다만 결국 다이렉트 X 10이라는 진부한 이름이 붙게 되었습니다.    일단 다이렉트 X 10은 윈도우즈 비스타가 필수입니다. (하지만 비스타 초기버전에 탑재되는 것은 다이렉트 X 9입니다) 이는 드라이버 체계가 바뀌었기 때문입니다. 그리고 지금까지는-2006년 8월- 다이렉트 X 10을 지원하는 그래픽 카드가 나오지 않았습니다. 따라서 지금 나와있는 모든 그래픽카드들은 다이렉트 X 10이 나와도 다이렉트 X 10의 기능을 사용할 수 없습니다. (다이렉트 X 10을 지원할 예정인 그래픽카드는 NVIDIA의 G80과 ATI의 R600이 있습니다.)    다이렉트 X 10은 새로 추가한 기능도 있는 반면, 기존 기능을 줄이거나 없앤 부분도 많습니다. 위 그림은 다이렉트 X 10에서 사라진 기능들 -안개 효과, 포인트 스프라이트, 클립 플레인 등-입니다. 이런 사라진 기능들은 앞으로 세이더를 통해 게임 엔진이 직접 연산하게 됩니다. 또 Capability 체크가 사라집니다.    지금 사용되고 있는 여러 GPU 들은 당연히 그 지원하는 기능에 차이가 있습니다. 따라서 3D 프로그램에서 어떤 기능을 사용할 때에는 일단 그 기능을 사용할 수 있는지 체크를 하고, 그 다음에 사용 가능한 기능만으로도 3D 엔진이 작동할 수 있도록 설계해야 했습니다. 하지만 다이렉트 X 10에서는 많이 사용되는 기능들을 표준으로 체택하여 이런 체크가 필요하지 않도록 합니다. 만약 새로운 기술이나 기능을 사용하는 GPU가 나오면 다이렉트 3D 10.1 같은 식으로 업데이트를 함으로서, 새 기능 하나하나를 체크하지 않고 다이렉트 3D의 버전을 체크하는 것만으로 끝날수 있도록 할 예정입니다. (이는 오픈GL과 매우 비슷합니다) 그리고 API 처리 부분을 상당히 간소화 했습니다.    지금 다이렉트 X 9의 구조입니다. 게임에 나오는 등장인물, 무기, 배경같은 것들은 모두 하나의 오버젝트입니다. 그리고 게임에는 수많은 오브젝트가 나오게 됩니다. 모든 오브젝트는 다이렉트 X 9를 거쳐 드라이버로 보내지면서 오버헤드-드라이버의 설정과 명령-이 붙게 됩니다. 따라서 게임 내의 오브젝트가 많을수록 오버헤드 역시 늘어나게 되며, 구성시간이 길어지게 됩니다. 그래서 지금 다이렉트 X 9의 구조에서는 3D 프로그램에 할당되는 시간이 그리 길지 못합니다.    따라서 다이렉트 X 10에서는 오브젝트를 자동으로 드라이버에 대입하도록 하여 이 시간을 줄입니다.    이는 게임 중에서 더 많은 오브젝트를 사용할 수 있음을 뜻합니다.    그리고 이렇게 API가 간략해짐으로서 하나의 명령을 처리할때 더 적은 CPU 사이클로도 처리가 가능하게 됩니다. 아래 도표는 다이렉트 3D 9에서 10이 되면서 사이클이 얼마나 감소되는지 보여주고 있습니다.      여기까지 왔으니 잠깐 쉬어가도록 합시다. (왜 또 나가토인가...라는 항의는 외면합니다) 아래 그림은 다이렉트 X 9와 10을 사용하는 그래픽카드의 간단한 파이프라인 구조도입니다. 위의 그림에서도 볼 수 있듯이, 다이렉트 X 10의 제일 큰 특징은 역시 지오메트리 쉐이더라는 새로운 쉐이더가 등장했다는 것이 되겠습니다. 기존의 버텍스 쉐이더는 하나의 버텍스를 입력해서 연산을 거쳐 다른 값으로 변환하는 방식이었습니다. 즉, 어떤 버텍스를 투명하게 만든다던가 회전한다던가 하는 작업을 하나씩 처리하는 쉐이더입니다. 하지만 지오메트리 쉐이더는 한번에 여러가지의 값을 입/출력할 수 있습니다. 하나의 버텍스를 입력받아 연산을 거쳐 다수의 버텍스를 출력할 수 있는 것입니다. 뿐만아니라 선이나 다각형까지도 처리가 가능합니다. 이는 그림자 생성이라던가 털, 머리카락, 지느러미, 복잡한 연기, 폭발 등의 효과를 만드는데 큰 도움을 줍니다. 아래는 지오메트리 쉐이더를 이용한 예제들입니다.    지오메트리 쉐이더를 사용해서 그림자를 만든 것입니다. 광원 쪽의 시점에서 오브젝트의 윤곽을 형성하는 버텍스를 모아 새로운 폴리곤을 만들어내 그림자를 볼륨을 생성한 것입니다.    이건 노말 맵핑을 사용한 오브젝트입니다. 이 물고기의 등 부분을 봐주시기 바랍니다. 지금은 등 부분에서 위로 튀어나온 가시를 표현할때 텍스처 자체의 그림자만으로 표현했지만- 치환 맵핑을 사용한 오브젝트입니다. 지오메트리 쉐이더에서 테셀레이션 작업을 할때 텍스처에서 튀어나온 값을 읽어내어 그 데이터를 토대로 폴리곤을 생성하여 치환 맵핑이 가능한 것입니다. 위 오브젝트의 형성 과정입니다. 버텍스 쉐이더에서 버텍스들을 처리하고, 지오메트리 쉐이더에서 폴리곤을 만든 다음, 픽셀 쉐이더에서 광선 추적을 합니다. 지오메트리 쉐이더에서 값을 해석하여 싱글 패스로 큐브맵을 랜더링하는 것입니다.      버텍스 쉐이더에서 하나의 이미지를 다른 시점에 맞도록 계산하여 재가공하고, 지오메트리 쉐이더에서는 모든 면을 계산하여 큐브맵의 해당 경로에 배치함으로서 한번에 6개 면을 가진 동적인 큐브 환경 맵을 만들게 됩니다. 스트림 아웃풋-연속 출력-은 지오메트리 쉐이더에서 비디오 메모리로 출력하는 부분입니다. 한번에 한개가 아니라 여러개의 버퍼에 데이터 출력이 가능하며, 이미 계산된 값을 다시 사용하여 계산량을 줄일수 있습니다. 버텍스 쉐이더나 지오메트리 쉐이더에서 3D 오브젝트롤 변환시켜 랜더링 한것을 스트림 아웃풋을 통해 랜더링 파이프라인에 재입력하면 오직 CPU에서 실행하는 3D 엔진 없이도 GPU만으로 움직이는 오브젝트를 생성할 수 있습니다. 여기서는 간단하게 데모를 보여주고 있습니다. 위에서 설명한 지오메트리 쉐이더와 연속 출력을 이용해 순수 GPU만으로 불꽃놀이같은 움직이는 화면을 만들어 내는 것입니다. 하나의 파티클을 지오메트리 쉐이더로 늘려서-불꽃의 폭발- 늘어난 파티클을 지오메트리 쉐이더를 이용해 폴리곤으로 만들어 불꽃이 흩어지도록 하고 다시 이 폴리곤을 지오메트리 쉐이더로 없애는 -불꽃이 사라짐- 순서를 연속 출력으로 반복하게 하는 것입니다. 지오메트리 쉐이더로 하나의 파티클을 여러개의 파티클로, 다시 이 여러개의 파티클을 폴리곤으로 만듭니다.    지오메트리 쉐이더로 오브젝트의 움직임에 따라서 폴리곤을 만듬으로서 모션 블러-잔상 효과-를 구사할 수도 있습니다.    이쯤에서 한번 더 쉬도록 합시다 -_-a 이쯤되면 눈치채셨겠지만 당연히 나가토입니다. ...짤방이 이런것밖에 없어서...는 거짓말이고, 글 쓰는 사람 본인 취향에 맞춰서 쉬어가자니 다른 대안이 없습니다 -_-a 다음은 통합쉐이더입니다. 다이렉트 X 10은 통합쉐이더를 지원하지만 NVIDIA와 ATI의 다이렉트 X 10 지원 차세대 그래픽은 완전히 다릅니다. 이것은 NVIDIA G80의 구조도입니다. 버텍스-지오메트리-픽셀 쉐이더가 이어져 있습니다.    ATI R600입니다.(S3의 데스티네이션도 이 구조라고 합니다만 글쎄요 -_-...) 통합 쉐이더에서 버텍스/지오메트리/픽셀 쉐이더의 모든 역할을 담당합니다. 그럼 왜 통합 쉐이더를 도입한 것일까요. 일단 지금 사용되는 전통적인 픽셀/버텍스 쉐이더의 사용량을 보도록 합시다. 보시는 것처럼 픽셀 쉐이더와 버텍스 쉐이더의 작업량은 일정하게 정해져 있지 않습니다. 화면에 출력되는 그래픽에 따라서 차이가 있을 수밖에 없는 것이지요. 따라서 지금의 쉐이더 방식으로서는 작업량이 어느 한쪽의 쉐이더 엔진에만 편중되는 불균형한 현상이 종종 발생하는 것을 막을 수 없습니다. 구체적인 예를 들어 보겠습니다. 이 게임은 엘더스크롤4: 오블리비언입니다. 오블리비언의 야외 풍경은 많은 풀과 나뭇잎으로 둘러싸여 있습니다. 이 경우 버텍스 쉐이더가 해야 할 일은 늘어나지만 픽셀 쉐이더가 해야 하는 일은 그리 많지 않습니다. 게다가 다이렉트 X 10부터는 위에서 본대로 지오메트리 쉐이더가 추가됩니다. 쉐이더의 종류가 늘어나면 이렇게 작업이 편중되는 현상이 더 심해질 수밖에 없습니다. 이런 불균형 현상 외에도, 쉐이더의 분리는 원가 상승의 한가지 원인이기도 합니다.(그래픽 카드의 가격을 결정하는 중요 요인 중에 쉐이더 파이프라인의 숫자가 포함되어 있음을 잊지 마시길 바랍니다) 그래서 다이렉트 X 10에서 마이크로소프트는 통합 쉐이더 구조를 사용할 것을 '강력하게 건의하고' 있습니다. 쉐이더는 여러개의 쉐이더 유닛이 있습니다. 통합쉐이더는 1번 유닛은 픽셀, 2번 유닛은 버텍스, 3번 유닛은 지오메트리... 이런 식이 아니라 -_-a(이럴거면 통합 쉐이더의 의미가 없죠) 쉐이더 매니저가 연상 상황에 따라서 정해주는 대로 그때그때 쉐이더의 역할이 바뀌는 형식입니다. 속칭, 멀티플레이어입니다. 텍스쳐 역시 비디오 메모리에 저장된 단순 데이터로 처리되어, 이를 필요에 따라 다르게 해석하여 쉐이더에 전달하여 사용하는 방식입니다. 이러한 통합 쉐이더 구조를 사용하는 GPU는 "그래픽 작업'만' 하는 프로세서'에서 "그래픽 작업'도' 하는 프로세서"가 될 수 있습니다. 즉, 이 구조를 응용하여 그래픽이 아닌 다른 종류의 연산 작업-물리 연산이나 영상 디코딩 등등-에 사용할 수 있는 것입니다. (ATI는 이미 자사의 그래픽카드를 이용하여 물리 가속을 할 수 있도록 추진중입니다) 이런 통합 쉐이더는 쉐이더 유닛간에 기능 차이가 없기에 실행할 수 있는 명령 세트도 전부 같습니다. 따라서 픽셀 쉐이더 뿐만이 아니라 버텍스/지오메트리 쉐이더로 사용되도 텍스처를 엑세스 할 수 있습니다. ATI는 4년 전부터 이런 통합 쉐이더 구조의 설계를 시작하여, 지금 엑스박스360에 들어간 제노스 GPU는 이 통합 쉐이더 구조를 사용하고 있습니다.(하지만 정작 엑스박스360은 다이렉트 X 10 기반은 아니며, 마소에서 다이렉트 X 10 패치를 내놓을 계획도 없습니다) ATI R5XX 시리즈에서 이미 사용된 링버스 메모리 버스 시스템, 픽셀 유닛을 조절하는 울트라스레딩 디스페치 프로세서 등의 기술은 R600에서 통합쉐이더와 맞물려 상당한 성능 향상을 가져올 것으로 보입니다. NVIDIA는 아직까지 통합쉐이더를 사용한 GPU 계획이 없으며 G80은 여전히 지금의 독립 쉐이더 구조입니다. 하지만 G80의 스펙은 다이렉트 X 10을 완벽하게 지원합니다. 그런 이유로 해서 한번 더 쉬어갑니다. 속칭 하루히 댄스입니다. 원래는 움직이는 gif 파일을 올릴려고 했는데 파일 용량 500k 제한 때문에 이걸로 바꿨습니다 -_-a 쉐이더 모델 4.0도 다이렉트 X 10의 큰 변화 중에 하나입니다. 하지만 아직 구체적인 명령어 세트까지 공개되진 않았습니다. 일단 스펙을 비교해 봅시다. 쉐이더 모델이 버전업되면서 어떤 변화가 있는지를 알려주는 도표입니다. 이 표는 기존 다이렉트 X 9.0과 기존 제품들, 그리고 다이렉트 X 10의 스펙 비교입니다. (이미지를 눌러 큰 화면에서 글자를 보시길 바랍니다) 이렇게 스펙이 대폭 늘어났다는 것은 게임 개발자들에게 더 큰 공간을 제공한다는 것을 의미합니다. 그리고 하드웨어 RGBE를 지원하여 HDR을 처리할때 별도로 인코딩이나 디코딩을 하여 HDR 렌더링을 할 필요가 없어졌습니다. 그리고 FP16 대신 완전 FP32 연산을 사용하여 더 세밀한 화면을 구사할 수 있습니다. 하지만 FP16을 완전히 포기하는것은 기존 그래픽카드들 중에 일부 FP32를 지원하지 않는 제품의 호환성이나 성능 저하등의 문제를 야기할 수 있습니다. 쉐이더 모델 4.0의 매리트는 명령어 세트의 확장보다는 각 쉐이더의 명령어 세트 사용 제한이 사라진것이 더 크다고 볼 수 있습니다. 그리고 정수 명령어 세트와 버퍼를 도입하여 이를 통해 쉐이더의 변환을 빠르게 처리할 수 있습니다. 정수 버퍼를 비디오 메모리에 할당해 두면 자유롭게 접근이 가능하고 쉐이더를 사용할 때마다 이를 전송할 필요도 없습니다. GPU는 원래 CPU와 정 반대로 부동소수 위주이긴 하지만, 쉐이더 모델 4.0을 통해 2진 논리 연산이나 동적/정적 분기 예측 등이 가능하므로 GPU가 기존에 CPU가 담당했던 작업을 하도록 만들 수도 있습니다. 그럼 중요 기능들은 대강 설명이 다 된듯하니(...누구 맘대로 설명이 다 돼?) 자잘한 것들을 대충 거론하고 끝내겠습니다. -_-a (...이젠 나가토 짤방도 더 설명할 밑천도 이젠 다 떨어졌습니다..) 일단.. 가상 메모리가 있습니다. 다이렉트 X 10을 이용하여 가상 메모리를 관리함으로서, 모든 텍스처나 랜더러를 작은 데이터로 나눠 저속의 버스에서도 데이터 전송이 가능하게 합니다. 그리고 물리 가속이 있습니다. 하지만 물리가속은 다이렉트 X 10에서는 지원하지 않고 다이렉트 X 10.1이나 되야 지원할 것으로 보입니다. 안티 에얼라이싱의 강화도 있습니다. 하드웨어 RGBE 지원으로 사용이 간단해진 HDR이 강화된 안티 에얼라이싱과 결합되면 더 멋진 화면을 보여줄 수 있을 것입니다. 이상입니다. 아직까지는 다이렉트 X 10도, 다이렉트 X 10을 지원하는 그래픽 카드도, 다이렉트 X 10을 사용하는 게임도 나오지 않았습니다. 자세한건 나와봐야 알 수 있겠지요 -_-a 만약 영어에 능통하신 분이시라면 세계 최고의 다이렉트 X 관련 사이트인 http://msdn.microsoft.com/directx/에서 더 많은, 그리고 더 확실한 정보를 얻으실 수 있을 것입니다. 앞으로 더 자세한 정보가 나오면 어김없이 낄낄뉴스에서 바로바로 소개해 올리겠습니다. 그때까지 이걸로 땜빵하시길. 여기까지 보시느라 고생하셨습니다. 그런 의미에서 마지막 짤방입니다. (이제야 하루히 8권을 보러 갈 수가 있겠구나~)
기글하드웨어(http://gigglehd.com/zbxe)에 올라온 모든 뉴스와 정보 글은 다른 곳으로 퍼가실 때 작성자의 허락을 받아야 합니다. 번역한 뉴스와 정보 글을 작성자 동의 없이 무단 전재와 무단 수정하는 행위를 금지합니다.