||1ATI 라데온 HD 2000 시리즈, 특히 그중에서도 이번에 출시된 라데온 HD 2900XT의 아키텍처를 설명하고 그 성능을 알아보는 www.pcpop.com의 리뷰글입니다만, 주객이 전도되어 3D 기술에 대한 전반적인 설명을 한 부분이 훨씬 더 많은 글입니다.

따라서 좀 어렵고 전문적인 내용이긴 합니다만, 그만큼 도움이 되는 글이기에 무리를 해서 번역하게 됐습니다. 원 출처는 www.pcpop.com이고 번역/편집은 기글 하드웨어입니다.

여기서부터 2부 내용과 이어집니다. 2부를 안보신 분은 2부를 먼저 보시길 권장합니다. 2부 주소는 http://gigglehd.com/bbs/view.php?id=infoboard&no=114 이곳입니다.


독립된 전용 캐시

GPU는 처리하는데 필요한 거의 모든 데이터와 명령을 모두 대량의 메모리에 저장합니다. 메모리의 속도가 늘어나고, 512비트 메모리 버스로 대역폭을 두배로 늘렸으며, 링버스 시스템으로 딜레이를 낮췄음에도 불구하고, GPU의 메모리는 동기화 작동이 불가능하기 때문에, 캐시 메모리는 여전히 필요합니다. 그 개념은 CPU의 L1/L2, 데이터/명령어 캐시와 완전히 같습니다.



R600의 아키텍처 구조도에서 볼 수 있듯이, 모든 모듈에는 대량의 캐시가 준비되어 있으며, 이들 캐시는 각자 독립되어 그 직무를 담당하게 됩니다. 계속해서 각 부분의 캐시의 용도와 관련 기술에 대해 보도록 하겠습니다.



울트라 스레드 디스패치 프로세서는 독립된 쉐이더 상수 캐시와 쉐이더 명령어 캐시가 있습니다. 따라서 길이가 긴 코드를 사용하도 제한을 받지 않을 뿐더러, 배열 중에서 더 많은 최적화를 통해 효율이 비교적 낮은 명령어를 저장할 수 있습니다.



텍스처 캐시 부분입니다. 버텍스 캐시의 경우, 그 용량은 R580의 8배에 달합니다. R600의 L1과 L2는 서로 구별되어 있으며(G80은 8개로 나뉘어 있습니다. 왜냐하면 쉐이더 어레이가 8개이기 때문입니다. 용량은 384KB), 4개의 텍스처 유닛은 256KB 용량의 캐시를 공유합니다. RV630은 L2 캐시의 용량이 절반으로 줄어들었으며, RV610은 L2 캐시가 아예 없습니다.



컬러 캐시에는 색상 색인이나 RGBA 데이터를 저장합니다. 상당수의 경우 좌우 2개, 어떤 때에는 상하 4개의 캐시를 입체적으로 사용합니다.



Depth(심도) 캐시는 일반적으로 말하는 Z 버퍼입니다. 픽셀 Z축 방향의 수치를 저장하며, 깊이가 깊은 곳에서부터 작은 곳으로 교체되어 필요없는 데이터를 제거합니다. R600은 32비트 부동소수점 Z 버퍼를 지원합니다. 기존의 X1000 시리즈에서는 24비트를 지원했습니다.

스텐실 캐시는 스크린의 일부 위치에 있는 그림이 변하지 않도록 유지하고, 이를 다시 그리는데 사용합니다. 예를 들자면, 비행기 조종이나 레이싱 게임에서 대시보드 시점일 경우, 바깥의 배경은 변하지만 비행기/차 안의 계기판은 변하지 않겠지요.

R600의 Z 버퍼와 스텐실 캐시의 압축 비율은 16:1까지 상승되었으며(X1000 시리즈의 2배), 8xMSAA를 사용할 경우 압축률은 128:1에 달합니다. R600의 스텐실 캐시와 Z 버퍼는 하나로 합쳐져 있지만, 독립적으로 압축하여 저장하고 불러올 수 있습니다. 압축 데이터가 버퍼나 비디오 메모리에 저장할 수 있기 때문에 스텐실과 Z 버퍼 압축의 사용은 어떤 제한도 받지 않습니다.



메모리 리드/라이트 캐시는 CPU와 똑같이, GPU가 방대한 용량의 외부 비디오 메모리를 직접 접근하지 않고 캐시를 통해 사용하도록 합니다.

스트림 아웃 버퍼의 경우, 지금까지는 기하학체가 비디오 메모리에 쓰이기 전에 반드시 Rastor를 거치고 나서 픽셀 쉐이더로 보내졌습니다. 하지만 스트림 아웃 기술 덕분에 버텍스 쉐이더나 픽셀 쉐이더에서 버퍼나 비디오 메모리로 데이터를 직접 보낼 수 있게 되었습니다. 이러한 버퍼는 쉐이더를 다시 처리할 수 있게 하여 GPU가 이미 계산해 나온 결과를 중복 사용하여 계산량을 줄일 수 있게 합니다. 다이렉트 X 10에 새로 추가된 지오메트리 쉐이더는 버텍스 데이터를 통해 대량의 제오미트레 도형을 처리하고, 대량의 폴리곤을 빠르게 만들어, 새로은 그래픽 연산과 물리 연산 효율을 대폭 높일 수 있습니다.

여기까지 각각의 내장 캐시/버퍼가 각 모듈의 성능을 높이는데 어떻게 작용하는지 간단하게 살펴 봤습니다.


ATI GPU의 내장 캐시 관련 기술

텍스처, 컬러, Z축, 스텐실 캐시의 연결:
초창기의 비디오 메모리 캐시는 직접 캐시에 데이터를 기록하고 읽어들였습니다. 이 경우 데이터를 갱신하기 위해서 전체 캐시 데이터를 비우고 다른 구역의 데이터를 다시 써야만 했기 때문에 그 효율이 아주 떨어졌습니다. X1000부터 ATI는 캐시와 비디오 메모리 사이의 관계를 자유롭게 바꾸면서 일부분의 데이터만 갱신해도 되도록 하였습니다.


외부 비디오 메모리는 어떤 위치의 캐시건 사용할 수 있습니다.

이렇게 되면서 비디오 메모리의 명령 집중률(Hit rate)를 크게 향상시켰고, 비디오 메모리 대역폭의 소모를 줄였습니다. 텍스처, 컬러, Z축, 스텐실 캐시는 모두 비디오 메모리와 이런 방식으로 연결되어 있으며, 이렇게 함으로서 캐시의 점유량을 낮출 수 있게 되었습니다.

3Dc+텍스처 압축 기술


3Dc를 사용한 이후로 고해상도의 텍스처 맵핑을 사용하여 화질을 개선할 수 있게 되었습니다.

모든 캐시에 데이터를 저장하고 읽어들일때에는 압축과 압축 해제 과정을 거치게 되며, 그 압축 기술은 꾸준히 발전되고 있습니다. ATI의 3Dc 텍스처 압축 기술은 이미 마이크로소프트의 다이렉트 X 9.0c 표준에 도입되었습니다. 3Dc에 대한 자세한 설명은 앞에서 하였으니 여기서 다시 말하진 않습니다.

강화된 Z버퍼 압축 기술:
Z버퍼 데이터는 HSR(Hidden surface Removal)과 관련이 있습니다. GPU가 랜더링과 기본 뼈대를 그려내면서 3D 오브젝트를 막을때, 일반적으로 2개 물체를 전환하여 광원과 텍스처 맵핑을 진행하게 됩니다. GPU는 제일 마지막 단계에서 2개의 막힌 오브젝트를 서로 쌓아올리게 되는데, 이러한 과정은 우리가 볼 수는 없지만 GPU의 계산 자원을 사용하는 것입니다. HSR은 먼저 어떤 물체가 보이고 어떤 물체가 보이지 않는지를 연산하여, 보이지 않는것을 제거, GPU가 무효 처리되는 랜더링 작업을 하지 않도록 하여 그 성능을 높여줍니다.


강화된 Hierarchical Z 버퍼: 랜더링 전에 필요없는 픽셀을 알아내 지워버립니다.

무효 처리되는 랜더링 작업을 줄이면 전체 성능이 올라갑니다. ATI의 하이퍼Z 기술(Hierarchical Z: 멀티 레벨 Z 버퍼 모듈)은 그 이유로 하여 생겨난 것입니다. GPU가 좌표 전환을 완성한 후에 Hierarchical Z는 각각 버텍스의 Z축 위치를 판단, 어떤 버텍스가 화면에 보여질 필요가 없다고 판단되면, 이를 제거하여 무효 처리되는 렌더링 작업을 원천봉쇄합니다.

ATI R520코어에는 처음으로 Hierarchical Z 모듈이 사용되었습니다. R580의 Hierarchical Z 버퍼 용량은 50%가 늘어나 고해상도에서의 성능을 높였습니다. R600에서는 Hierarchical Z 버퍼를 또다시 개선, Hierarchical 스텐실을 도입하여 멀티 쉐도우 쉐이더 성능을 개선하였습니다. 개선된 Hierarchical Z는 Z 버퍼의 부하를 크게 줄여주었고, 비디오 메모리 대역폭을 절약합니다.


메모리 컨트롤러

ATI R300(라데온 9700)부터 처음으로 256비트 메모리 버스가 사용되었습니다. 그 이후로 고급형 그래픽카드의 메모리 컨트롤러는 이미 5년동안 발전이 맘췄으며, 오직 빠른 클럭의 메모리 모듈을 사용하여 메모리 대역폭을 높였을 뿐입니다. GDDR1부터 2, 3, 4에 이르기까지, 고클럭 메모리를 사용하는 그래픽카드는 상당 수준의 기판과 쿨링 설계를 필요로 하여, 비디오 메모리가 그래픽카드의 제조 원가에서 차지하는 비중이 갈수록 높아지고 있습니다. 거기에 메모리 대역폭이 그래픽카드의 성능을 어느 정도 제한하기 때문에, 차세대 다이렉트 X 10 그래픽카드에서는 마침내 메모리 컨트롤러가 업그레이드, G80은 384비트, R600은 512비트를 사용하게 됐습니다.


512비트 메모리 버스의 성능 향상

G80의 메모리 컨트롤러는 이해하기 쉬운 구조입니다. G71에 2개의 64비트 컨트롤러를 추가하였으며, 모든 메모리 컨트롤러는 ROP와 연결되어 384비트 메모리 버스를 만들게 됩니다. 여전히 크로스바 구조이고, 512비트를 사용할 필요가 없기 때문에 메모리 부분 원가가 줄어들게 되지만, 크로스바 구조의 메모리는 그 규모가 커질수록 관리가 매우 복잡해지고 PCB 회로가 대폭 늘어나 신호의 딜레이가 커지게 됩니다.


G80의 ROP와 메모리 컨트롤러

이것이 바로 ATI가 링버스 메모리를 사용하게 된 원인입니다. R520의 내부 메모리 버스는 사실 512비트(2개 256비트 원형 채널)이며, 4개의 링 스톱과 8개의 32비트 메모리로 구성되어 있습니다.


R520의 메모리 컨트롤러

이렇게 설계한 이유는 대역폭을 높이면서 비디오 메모리 컨트롤러의 부담을 줄이기 위해서입니다. 프로그램이 비디오 메모리에서 데이터를 가져오라고 명령을 내리면, 비디오 메모리 컨트롤러는 비디오 메모리 모듈에서 데이터를 읽어내지만, 그 데이터를 메모리 컨트롤러로 가져오는 것이 아니라 링버스에 보내버리고, 프로그램이 링버스를 통과한 데이터를 받는 구조이기 때문에 메모리 컨트롤러의 부하가 상당히 줄어들게 됩니다. 이러한 방식은 단순히 메모리를 읽어들일때 딜레이가 커질 수 있지만, 대다수의 작업 딜레이를 낮추고 데이터 명중률을 높여줄 수 있습니다.

링버스는 메모리 컨트롤러를 밖에서 둘러싼 형태이며, 이렇게 함으로서 각종 회로를 간단하게 줄여 처리 능력을 최적화하게 됩니다. 이는 언제 어디서든 코어의 각 부분이 최단 경로를 통해 연결된다는 의미이며, 이렇게 함으로서 메모리의 데이터 입력 조작 과정 중에 딜레이와 신호 저하 문제를 낮출 수 있는 것입니다. 링버스의 또다른 장점은 클럭을 쉽게 높일 수 있다는 것인데, 전통적인 메모리 컨트롤러는 내부의 회로가 직렬로 연결되었기 때문에 GDDR4와 같은 고클럭 메모리의 성능을 제대로 내기가 어려웠습니다.


ATI 메모리 컨트롤러의 변화

하지만 X1000 시리즈의 메모리 컨트롤러는 진정한 의미에서의 링버스 컨트롤러라고 보기 어렵습니다. X1000은 2개의 원형 채널을 통해 부하를 줄인 것에 지나지 않으며, ATI는 X1000에서 크로스바와 링버스의 혼합(하이브리드) 컨트롤러를 사용하였습니다. 그리고 지금 R600에서는 진정한 링버스를 실현하게 된 것입니다.


R600 내부는 1024비트 링버스를 사용하며, 외부는 512비트 버스를 사용합니다.

R600의 메모리 컨트롤러는 2개의 512비트 링버스와 4개의 링 스톱이 있으며, 모든 링 스톱은 2개의 64비트 메모리 채널이 있습니다. 따라서 R600은 중앙 컨트롤러가 없으며, 비디오 메모리에 데이터를 읽거나 쓸 때에는 모두 4개의 링 스톱에서 아비터를 통해 실행을 판정하게 됩니다.


R600 비디오 메모리 컨트롤러의 링버스 아키텍처

만약 기존의 크로스바 메모리 컨트롤러를 사용했다면, 반드시 8개의 64비트를 한번에 컨트롤해야 했지만, R600의 4개 링 스톱이 각각 2개의 64비트 메모리 채널을 담당하기 때문에, 4개의 링 스톱으로 1024비트(읽기/쓰기 각각 512비트) 내부 버스를 사용할 수 있게 된 것입니다. 모든 메모리 관련 조작은 아비터를 통해 실행 순서가 최적화되어 작동하기 때문에, 크로스바 구조보다 더 효율이 높은 것입니다.

R600의 링버스는 딜레이를 낮추고, 클럭을 높이고, 메모리 대역폭을 넓혔을 뿐만 아니라, 기판 회로를 간단하게 줄이고, 16개 메모리 모듈간의 간섭을 잦춰, 안정성을 높여 GDDR4 메모리를 완벽하게 지원합니다. R600은 지금 1GB 512비트와 512MB 512비트를 지원하며, 지금 출시된 라데온 HD 2900XT는 512MB 512비트(16개의 8M 32비트 모듈)를 사용하기 때문에, 앞으로 1GB 512비트 GDDR3/4 모델이 나올 수도 있습니다.

그 밖에도, ATI는 쌍방향 링버스에 프로그램 가능한 설계를 사용하였기 때문에, 비디오 메모리 아비터를 드라이버에서 조절할 수 있고, 사용자가 카탈리스트 A.I.의 기능 설정을 통해 최적화를 할 수 있습니다.


Tessellation의 소개

R600의 특징에는 통합쉐이더라던가 다이렉트 X 10 지원 등이 있습니다만, 이것은 경쟁상대인 지포스 8 시리즈에서도 모두 지원하는 것입니다. 반면 다이렉트 X 10 표준을 완전히 넘어선 Tessellation 기술은 오직 R600에서만 지원하는 것입니다. 테셀레이션 전용 데모까지 나오기도 했지요. 따라서 그 어떤 다른 기술보다도 테셀레이션에 더 많은 비중을 두고 설명하도록 하겠습니다.

테셀레이션을 간단하게 설명하자면 대략 이런 기능입니다. 'GPU 내부에서 버텍스를 자동으로 만들어 모델을 세밀하게 묘사, 더 나은 효과를 얻어내는 기술'


테셀레이션을 사용하면 모델을 더 세밀하게 묘사할 수 있습니다.

테셀레이션은 다이렉트 X 10 표준을 초월한 것이기 때문에, 다이렉트 X 10 표준을 지키는 GPU들이 반드시 지원해야만 하는 기술은 아닙니다. 오히려 표준보다 앞서서 구현된 것이지요.


테셀레이션은 다이렉트 X 10.1 계획에 이미 포함되어 있습니다. 여기에 대한건 마이크로소프트의 '다이렉트 X의 미래' 문서를 참고하시길 바랍니다.
다운로드 링크: http://download.microsoft.com/download/e/5/5/e5594812-cdaa-4e25-9cc0-c02096093ceb/the%20future%20of%20directx.zip

테셀레이션은 R600 GPU가 3D 모델에서 원래부터 존재하는 버텍스를 근거로 하여, 다른 요구사항과 다른 규칙에 따라 값을 집어넣어, 하나의 폴리곤을 여러개의 폴리곤으로 나누는 것입니다. 이 과정은 모두 프로그램이 조절할 수 있기 때문에 효율과 효과의 모순 문제를 해결할 수 있습니다.


라데온 8500의 트루폼 기술이 더 발전된 것이라고 보면 되겠군요.


전통적인 가상 3D 기술들의 이해

테셀레이션을 이해하기 위해서는 먼저 배경 지식들을 반드시 이해하고 있어야 합니다. 앞서서 3D 프로그램이 어떻게 그래픽을 연산하고 표시해 내는지를 소개한바 있습니다. GPU가 발전에 발전을 거듭하면서 등장하게 된 제일 큰 모순은 바로 성능과 효과 사이의 모순입니다. 3D 프로그래머가 더 화려한 화면을 만들어 내려면 반드시 더 복잡한 3D 모델을 써야만 하고, 그러기 위해서는 더 높은 성능의 GPU가 필요한 것이지요. 물론 이것은 GPU의 제일 큰 발전 원동력이기도 합니다만.

하지만 시간이 지나고 GPU의 기술이 발전하면서 다른 상황을 맞이하게 됩니다. 그것은 바로 3D 프로그래머가 프로그램을 만들때 소프트웨어의 호환성을 고려해야만 한다는 것입니다. 만약 R600이나 G80에서만 돌아가는 게임을 만든다면, 최적화 문제는 간단하게 해결될진 몰라도 그 게임을 팔긴 힘들겠지요. 또다른 문제는 더 복잡한 3D 모델을 사용할수록 게임 개발 비용을 더 늘어나게 된다는 것입니다.

따라서 GPU 제조사들과 마이크로소프트는 각양 각색의 방법을 동원하여, 3D 모델을 간단하게 유지하면서도 더 화려한 효과를 내는 방법을 만들어내게 됩니다.


텍스처 맵핑을 통한 질감 처리

3D GPU가 만들어졌을 그때부터 존재했으리라고 여겨지는 기술이 바로 이 텍스처 맵핑입니다. 절대 다수의 표면에는 요철 질감이 존재하는데, 엔지니어들은 처음에 텍스처 맵핑을 이용하여 이 모델을 더 진짜처럼 보이게 만드려고 했습니다.

벽돌 무늬의 텍스처 맵핑을 예로 들어보면, 맵핑 처리를 할때 그림자가 지는 부분을 좀 어둡게 함으로서 완벽한 표면 요철 효과를 얻을 수 있는 것입니다.


텍스처 맵핑을 통해 진짜와 같은 효과를 간단히 얻어낼 수 있습니다.

당연히 이 방법은 아주 오래된 것이며, 그 효과도 아주 떨어집니다. 왜냐하면 게임 개발자가 만들어 내는 것은 서로 영향을 미치는 동적인 3D 게임인 것이지, 멈춰있는 하나의 화면이 아니기 때문입니다. 따라서 일단 게이머가 텍스처 맵핑이 된 표면을 다른 시야각에서 본다면 그 입체감은 완전히 사라지게 됩니다. 그렇기 때문에 이 기술은 가상 3D 기술의 범위에 넣을 수 없습니다.


범프 맵핑 Bump Mapping

진정한 가상 3D 기술의 시작은 바로 범프 맵핑입니다. 이 기술은 지금까지도 광범하게 사용되고 있으며, 아주 좋은 효과를 얻을 수 있지만 자원 소모량이 그리 크진 않습니다.

범프 맵핑을 간단하게 설명하면, 3D 화면에 가상의 조잡한 표면 처리를 하는 것으로서, 깊이의 볌화에 따른 요철 재질 텍스처를 3D 모델링하여 광선 랜더링 처리를 거친 다음에, 이 오브젝트의 표면에 울퉁불통한 감각의 요철 효과를 구현해내는 것으로서, 오브젝트의 기하학적 구조를 변경하거나 외부 레이어를 늘릴 필요가 없는 것이 특징입니다.

예를 들어 자갈이 그려진 맵을 하나의 평면에 맵핑 처리했다고 칩시다. 처리 과정이 끝나면 이 평면은 자갈로 변하여 초원 위에 놓여지겠지요. 물론, 범프 맵핑을 통하여 만든 요철 효과는 빛의 방향이나 시야각에 따라 변하지 않으며 물리적인 효과도 만들어 낼 수 없습니다.


광선의 각도가 달라지면 다른 명암 효과가 생기게 됩니다.

범프 맵핑은 엄격하게 말하면 어떤 유형의 기술을 통칭하여 부르는 것이며, 이 기술은 여러가지 계산 방법에 따라 다양한 방식이 존재하며, 이 기술이 3D 게임에서 사용되는 범위는 매우 넓습니다.


범프 맵핑은 제일 많이 사용되는 기술이며, 그 응용 범위는 매우 넓습니다.

그럼 범프 맵핑의 원리에 대해 보도록 합시다. 아래 그림을 먼저 보시기 바랍니다. 절대 다수의 사람들은 이 그림의 요철 효과를 구분해 낼 수 있을 것입니다. 하얀색과 검은색 선으로 요철 효과를 나타내고 있습니다.



그럼 이 그림을 180도 돌려보도록 하겠습니다. 그럼 다음과 같은 그림이 됩니다.



보시는 것처럼 기존의 요철 효과가 완전히 반대로 나타나게 냅니다. 원래 튀어나와 있던 부분은 들어가고, 들어가 있던 부분은 나와 있습니다. 오직 180도 돌렸을 뿐인데 이런 효과가 나타나는 것이지요. 여기서 우리는 그림의 요철 효과라는 것이 정해진 것이 아니라 그냥 우리 눈의 착각일 뿐이라는 것을 알 수 있습니다.

우리가 생활하고 있는 환경에서, 광원은 대게 윗쪽에 존재합니다. 따라서 처음 그림을 보았을때, 밝은 테두리와 어두운 테두리선에 대한 정보가 대뇌에 전달되면, 어떠한 광원도 제시되어 있지 않은 상황에서, 대뇌는 광원이 위에 있다고 가정, 그 높낮이를 판단하여 알려주는 것입니다.

이것이 바로 범프 맵핑의 원리인 것입니다. 광선의 방향이 평면과 수직을 이루고 있다면 색이 제일 밝고, 광선의 방향이 평면과 평행 상태라면 색이 제일 어두운 것입니다. 이는 범프 맵핑의 제일 기본적인 계산법이며, 그 외에도 여러 종류의 다양한 계산법이 존재하고 있습니다만, 이들 계산은 딱히 정해진 것이 아니라 그래픽 엔지니어들이 계산하여 조절하는 것입니다.

범프 맵핑은 계산이 간단하여 연산량이 작고, 몇개의 점과 그 주위 점의 색상 데이터만 있으면 확정이 가능하다는 장점이 있습니다. 그러나 이렇게 얻어낼 수 있는 요철 효과가 상당히 제한적이고, 아주 간단한 효과만 얻어낼 수 있습니다. 일반적으로 관찰자의 시야각이 매우 적은 상황-땅이나 벽, 먼 거리의 풍경 등에 주로 사용됩니다.


노말 맵핑 Normal Mapping

노말 맵핑 역시 자주 사용된 가상 3D 기술입니다. '노말' 맵핑이기 때문에 그냥 평범한 맵핑 방식인걸로 오해하시는 분들도 계신데, 여기서 노말의 뜻은 '하나의 평면에 수직으로 존재하는 벡터값'인 것입니다.

노말 맵핑은 어떤 표면의 요철 상황을 모든 점의 벡터 값으로 기록하여, 맵핑을 할때 여기에 따라 빛과 그림자를 표현하여 요철 효과를 실현해 내는 것입니다.

노말 맵핑은 컴퓨터의 입장에서 보면 그 색이 매우 괴상하게 나오는데, 그 이유는 노말 맵핑이 RGB 데이터에서 얻어내는 것이 색상 정보가 아니라, 매개 점들의 벡터값이기 때문입니다.


둠3에서 사용된 텍스처와-


그 텍스처에 대응되는 노말 맵핑

노말 맵핑의 장점은 많습니다. 어느 부분이 들어가고 어느 부분이 나와있는지를 표현할 수 있을 뿐만 아니라, 다양한 경사도와 곡면 상황을 표현할 수도 있습니다. 다라서 노말 맵핑은 더 좋은 효과를 표현해 낼 수 있습니다. 앞서 설명한 ATI R520의 3Dc는 노말 맵핑에 텍스처 압축 기술을 보충하여 넣은 것입니다.

노말 맵핑은 더 좋은 효과를 표현할 수 있지만, 상대적으로 그 연산량이 더 많습니다. 모든 픽셀의 광원 상황을 연산하여, 그 점의 벡터값과 광원 상황의 각도에 따라 밝기와 색을 계산해내기 때문입니다.

노말 맵핑 역시 표현해 낼 수 있는 요철 효과의 폭이 그리 크지 않기 때문에, 함몰되거나 돌출된 정도가 그리 심하지 않은 표면 효과에 주로 쓰입니다.


Parallax Occlusion Mapping

앞에서 노말 맵핑을 소개하면서 그 단점도 설명하였습니다. 그걸 해결하기 위해 등장한 것이 바로 Parallax Occlusion Mapping(시차 교합 맵핑? 정도가 될까요)입니다. Parallax Occlusion Mapping은 더 나은 '높낮이' 시각 효과를 구현할 수 있으며, X1900 때부터 사용되기 시작했습니다. 그 중 제일 유명한것은 Toyshop 데모가 되겠습니다.


Parallax Occlusion Mapping은 더 나은 요철 효과를 구현해 낼 수 있습니다.

Parallax Occlusion Mapping은 텍스처의 좌표를 전환하여, 돌출되어 있는 텍스처로 다른 텍스처를 가려버립니다. 이렇게 하면 더 좋은 요출 효과를 볼 수 있는 것이지요. 하지만 이 기술 역시 노말 맵핑에 의존하여 처리하기 때문에 노말 맵핑에서 파생된 기술이라고 말할 수 있겠습니다.

이 기술을 사용하기 위해 하드웨어가 별도로 지원해야 하는 것은 없습니다. 이 Parallax Occlusion Mapping의 개념 자체는 아주 예전부터 존재한 것이지만, 실제 프로그램에서 사용된 것은 그리 오래된 일은 아닙니다. Parallax Occlusion Mapping의 연산량이 노말 맵핑의 연산량과 별 차이가 나지 않기 때문에 기존의 구형 GPU에서는 이를 계산해 낼 수가 없었고, X1900 정도가 되어서야 GPU에서 이를 처리할 수 있게 된 것입니다.

모델에 영향을 주지 않는 가상 3D 기술을 놓고 볼 때, Parallax Occlusion Mapping은 이미 그 극한에 이르른 기술입니다. 이를 통해 얻어낸 효과는 매우 사실적이며, 지금 맵핑 작업에서는 광범위하게 이 기술을 사용하고 있습니다.

다만 여전히, 가상 3D 기술의 제일 큰 아쉬움은 남습니다. 옆에서 보면 평평하게 보인다는 것이지요. 모델을 바꾸지 않고 가상으로 이런 효과를 얻어낸 것이기 때문에, 노말 맵핑이건 Parallax Occlusion Mapping이건 시야각에 따라 요철 감각이 완전히 달라진다는 것은 어쩔 수 없는 일입니다.


Displacement Mapping

그래픽 업계의 전문가들과 GPU 제조사에서는 일찌기 앞에서 설명한 맵핑 기술들의 단점을 파악하였고, 더 세밀하고 진짜같은 효과를 만들기 위해 많은 노력을 기울였습니다.

제일 고전적은 방법은 역시 모델을 더 자세하게 만드는 것이지요. 3D 영화 업계가 이 길을 택했습니다.




하지만 이러한 '해결책'은 문제를 해결하진 못했습니다. 영화 회사에서 수백 수천개의 워크스테이션을 몇달동안 돌려서 랜더링을 해야만 했으니까요. 그리고 게이머들이 원하는건 '실시간 랜더링'이지 말입니다.


골룸만 하더라도-


엄청나게 복잡한 모델을 사용합니다.

만약 3D 모델을 더 자세하게 묘사하고 싶다면 더 많은 폴리곤을 사용해야 하고, 더 많은 폴리곤을 사용할려면, 하나의 모델에 더 많은 버텍스를 집어 넣어야 합니다. 버텍스의 양이 많아질수록 연산량이 늘어나고, 데이터 전송 문제와 병목 현상이 얼어나게 되겠지요.


방대한 양의 버텍스 데이터는 대량의 대역폭을 필요로 합니다.

초창기의 GPU는 픽셀 데이터만 처리할 수 있었고, 나중에 버텍스의 T&L이 가능하게 됐습니다. 하지만 버텍스 데이터는 전부 CPU에서 그래픽카드로 보내는 것입니다. 몇년 전, AGP 그래픽카드를 사용할때는 지나치게 복잡한 모델의 버텍스와 텍스처 데이터가 서로 전송 대역폭을 차지하려 경쟁(?)하기도 했습니다. 우리가 원하는건 정지된 화면이 아닌, 움직이는 3D 프로그램입니다. 그 안에 등장하는 모든 버텍스는 그 위치를 옳기기 때문에, 매 시각마다 대량의 버텍스의 위치 정보를 만들어내어야 했고, CPU는 게임 엔진과 물리 모델을 처리할 여력이 없었습니다.

이러한 상황을 해결하기 위해, GPU 제조사에서는 상당한 묘안을 내놓게 되는데 그것이 바로 Displacement Mapping입니다. 디스플레이스먼트 맵핑의 핵심은 GPU 내부에서 새로운 버텍스를 만들어내어 더 높은 세부 묘사를 가능하게 하는 것이며, 이러한 버텍스 제작 과정은 완전히 그래픽카드가 담당하여 처리하는 것으로, 그 위치는 기존에 존재하는 모델의 버텍스에 따라 결정됩니다.

디스플레이스먼트 맵핑의 원리는 대략 이렇습니다. 일단 게임 개발자들이 먼저 heigt map을 준비해 둡니다. 이 heigt map은 노말 맵핑과 비슷하지만, 노말 맵핑이 하나의 평면 위에 모든 점의 요철 거리를 나타낸 반면, heigt map은 하나의 흑백 map에 회색 점의 색으로 그 높낮이를 표시합니다.

이 모델이 그래픽카드에 들어가면 먼저 기본 Mesh를 세분화하며, 그 결과는 곧 여러 버텍스를 만들어낸 것입니다. GPU는 Heigt map에 따라 이러한 버텍스의 위치들을 다시 정해주고, 버텍스의 위치 좌표를 heigt map에 따라 결정합니다.


테셀레이트를 통해 베이스 메쉬를 잘게 나눠 테셀레이티드 메쉬를 만듭니다. 여기에 디스플레이스먼트 맵핑을 통해 메쉬를 구성하는 점 중에서 heigt map에 반응하는 점을 토대로 그 값에 따라 높낮이를 조정하는 기하학적인 전환을합니다. 여기에 텍스처를 씌우고 광원 효과를 추가하여 출력하면 끝입니다.

실제로 존재하는 버텍스를 만들어내기 때문에 그 표현 효과는 매우 뛰어나며, 단순히 모델을 더 복잡하게 만드는 것보다 연산 자원이 절약됩니다. 다만 대량의 버텍스 연산이 필요하기 때문에 효율이 아주 뛰어난 것은 아닙니다. 그래서 GPU 데모에는 자주 쓰이지만 게임 개발자들은 별로 사용하지 않는 기술이기도 합니다. 게다가 버텍스의 제작과 표시는 전부 GPU에서 담당하지만, 여전히 CPU가 이 과정 중에 상당한 연산을 담당해야 한다는 것도 단점입니다.


ATI의 독문무공(獨門武功). Truform

2001년 7월에 다이렉트 X 8.1이 나오기 전의 일입니다. 멜트다운2001에는 ATI와 NVIDIA가 모두 참가하여 다이렉트 X 8.1의 기술적인 부분을 같이 상정하였지요. 당시 유명 제조사들이 모두 참가하였고 언론 매체에서도 650$라는 어마어마한 가격의 표를 돈주고 사서 들어갔을 정도로 관심이 높은 회의였는데, 그때 NVIDIA와 마이크로소프트의 관계가 별로 좋지 못했기 때문에 ATI가 마이크로소프트의 파트너가 되어 다이렉트 X 9의 개발에 제대로 참여하게 됐습니다.



마이크로소프트는 여기서 다이렉트 X 8.1의 표준을 정하게 됩니다. 이때 N-Patch라는 새로운 기술을 도입하게 되는데, 이는 앞에서 설명했던 각종 가상 3D 기술과 디스플레이스먼트 맵핑보다도 더 절묘한 기술로서, 디스플레이스먼트 맵핑처럼 버텍스를 만들어 내지만 Heigt map이 별도로 필요하지 않고, 모델에 알아서 부드럽게 변하는 그런 기술이었습니다.


Truform의 신기한 효과

N-Patch의 원리는 이렇습니다. GPU가 모델을 읽어들인 후에 모든 삼각형의 꼭지점(버텍스) 3개의 노말 벡터값을 판단해, 이 벡터값을 근거로 하여 집어넣는 버텍스의 위치를 계산하는 것입니다.



N-Patch는 하나의 모델을 '부드럽게' 만드는데 매우 적합했기 때문에, 곡면이 많은 모델에 사용하기 좋은 기술이었습니다. 왜냐하면 일반적인 방법으로 곡면을 표현하기 위해서는 오직 대량의 내부/외부 분할 폴리곤을 만들어서 곡면과 비슷한 효과를 내는 방법밖에 없었기 때문이지요.



N-Patch가 삼각형의 버텍스 연결선을 조정하여 곡면으로 만드는 것입니다.

N-Patch는 계산이 매우 간단했습니다. 그냥 체귀 연산을 여러번 하여, 하나의 면에서 더 고차원의 곡면을 만들어 내면 되는 것인데, N-Patch라는 이름은 이 N차 곡면에서 따온 것입니다.

ATI는 라데온 8500에서 이 기술을 먼저 사용, TruForm이라고 명명합니다. 이 기술은 디스플레이스먼트 맵핑보다 효율이 더 높으며 실제 효과도 매우 괜찮습니다. 다만 이 기술은 돌고래나 레이싱 카처럼 그 표면이 곡면으로 된 모델에만 사용할 수 있으며, 탱크처럼 곡면이 필요하지 않은 모델에 만들었다가는 모델이 완전히 바뀌어버리고 맙니다.


시리어스 샘입니다. 총의 모양이 동그랗게 변해버렸습니다.


카운터 스트라이크입니다. 모델이 뚱뚱하게 변해버렸습니다.

TruForm은 매우 재미있는 기술이지만 마이크로소프트와 ATI의 기대처럼 그리 많이 사용되진 않았습니다.


Tessellation과 그 계산 방법

Tessellation는 앞서 말한 TruForm과 비슷하지만 그 기능이나 효과는 다른 부분이 있습니다.




테셀레이션은 조잡한 모델을 세밀하게 바꿔줍니다.

테셀레이션은 메쉬구조를 구축하여 세분화 과정을 처리합니다. 앞서 디스플레이스먼트 맵핑을 소개할때 여기에 대해 소개하였습니다만, 디스플레이스먼트 맵핑은 메쉬를 같은 비율로 나누지만 테셀레이션은 그 세부 분화 정도가 장소에 따라 다릅니다. 어떤 곳은 대충대충, 어떤 곳은 더 자세하게 나누는 형식이지요.

이러한 테셀레이션의 메쉬 세분화 계산법에는 3가지 방법이 있습니다.


버텍스의 위치를 만들때 똑같이 나누는 방법입니다. 새로 만들어진 점들 사이의 거리는 모두 같습니다. 이러한 계산 방법의 변수는 정수이며, 모든 변에 삼입되는 버텍스의 수치가 바로 변수입니다. 이 방법은 매우 기초적인 방법이지만 역시 그 한계가 뚜렷하게 드러나기도 합니다. 제일 기본적인 삼각형 데이터 포멧을 처리할때문 사용됩니다.


이 방법의 특징은 부동 소수점을 변수로 사용할 수 있다는 것입니다. 만약 변수의 소수 부분이 0이면 이 계산은 방법은 앞에서 설명했던 것과 똑같은 결과를 출력하지만, 소수 부분에 일정 값이 있다면 중심 부분이 더 세밀하게 나눠집니다.


이 계산법은 메쉬를 세분화할때 도형의 변에 따라서 다르게 세분화합니다. 이렇게 할 경우 자원을 더 잘약할 수 있습니다. 여기서의 변수 역시 부동 소수이지만, 각 변마다 서로 다른 변수를 사용할 수 있습니다. 이 계산에서 변수의 범위는 1.0부터 15.0까지입니다.


메쉬 세분화 계산에서의 소수점의 의미

앞서 소개한 3가지 계산에서 뒤의 2개는 모두 부동 소수를 변수로 사용합니다. 그렇다면 부동 소수를 사용하는 이유는 무엇이고, 중간 부분만 더 자세하게 나누는 이유는 무엇이며, 소수점이 어떤 작용을 하는지 보도록 하겠습니다.



위의 그림은 모두 테셀레이션을 사용한 것입니다. 변수의 작은 차이로 그 모양이 달라지며 다양한 효과를 나타낼 수 있습니다.

게임에 등장하는 모든 모델은 멀고 가까운 거리의 차이가 존재합니다. 시스템 자원을 절약하기 위해 가까운 곳에 있는 모델은 더욱 자세하게 묘사하는 것이 테셀레이션 기술을 사용하는 진정한 의미입니다. 따라서 거리에 따라서 세분화 정도를 다르게 하여 더 높은 효율로 연산을 진행할 수 있습니다.

만약 모델의 자세한 부분 변화 과정이 눈에 보인다면 이건 실패한 것이나 다름 없습니다. R600은 전통적인 정수 확산 방식의 메쉬 세분화 연산법도 사용하기 때문에 변화 과정이 쉽게 드러나게 됩니다. 게다가 이 모델은 테셀레이션을 통해 각종 부분을 처리하기 때문에 모델 표면에 그려진 광원 등의 효과가 갑자기 변하는 것이 더욱 눈에 잘 띄게 됩니다. 따라서 R600은 부동소수점을 변수로 사용함으로서 이러한 현상을 피할 수 있게 됐습니다.



R600의 테셀레이션에서 변수의 소수 부분은 두번째 메쉬 세분화 위치를 표시합니다. 만약에 변수가 1.1이라면 첫번째 세분화 부분이 2개 버텍스의 중심이고, 두번째 세분화 부분이 중심에서 1/40 정도 떨어진 곳에 위치한다는 의미입니다. 만약 1.5라면 5/40이 되겠지요. 2.0이라면 두번을 똑같이 나누는 것입니다.


Tessellation 효율의 원천, '새장'의 조절

테셀레이션은 아주 많은 버텍스를 자동으로 만들어 냅니다. 이러한 버텍스들은 모두 실제로 존재하는 것이며, 그 효과는 모델링을 할 때 직접 만들어 낸 것과 같습니다. 하지만 이러한 대량의 버텍스 데이터가 포함된 모델이 움직인다면 그때 필요한 연산량은 아주 클 수밖에 없습니다.



위 그림에서 보라색 모델은 테셀레이션 처리를 거친 후에 얻어낸 결과물입니다.이 모델을 노란색 선이 마치 '새장'처럼 둘러싸고 있다는 것을 눈여겨 보시기 바랍니다. 이 노란색 선은 모델을 조절하여 만들어낸 것으로서, 모델의 위치를 바꾸는 계산을 수행할때 이렇게 간단하게 처리함으로서 자원을 크게 절약할 수 있습니다.

R600의 테셀레이션은 제대로 된 움직임을 구현하기 전에, 먼저 이 '새장'의 위치를 먼저 계산해 내고, 이 새장의 각 부분에 따라 모델의 모든 버텍스 위치를 다시 계산해 내는 것입니다. 이렇게 함으로서 아주 높은 효율의 계산이 가능한 것이지요.


버텍스 삽입 기술

기초적인 모델 메쉬 세분화 조작에 대해 설명하였으니 다음올 새 버텍스를 만들어 그 구체적인 위치를 결정하는 방법에 대해 보도록 하겠습니다. 기존의 디스플레이스먼트 맵핑에서는 height map을 사용하여 새로운 버텍스의 위치를 결정합니다. 이 과정은 매우 간단하게 이해할 수 있습니다.


디스플레이스먼트 맵핑의 과정입니다. 점들의 높이가 표시된 Height map을 이용합니다.

하지만 Height map은 치명적인 단점이 존재합니다. 곡선의 구체적인 형상을 표현할 수 없기 때문에 하나의 곡선을 여러개로 나눈다면 그 정밀도가 부족하게 되는 것이지요.

R600의 테셀레이션은 버텍스를 정해진 위치에 집어넣는 여러 종류의 방법을 지원하여 각종 곡면을 만들 수 있습니다.

1. N-Patch 곡면. TruForm에서 설명했던 것과 마찬가지로, 삼각형의 꼭지점(버텍스)의 기준선으로 곡면을 만듭니다.
2. 베셀 곡면. 베셀 곡선 공식에 따라 버텍스의 위치를 계산합니다.
3. B-Spline, NURBs, NuBs 곡선(이 3가지 곡선은 캐드에서 자주 사용되는 곡선으로, 마야같은 응용 프로그램에서 만들 수 있습니다)
4. 체귀 계산법을 통한 Catmull-Clark 극한 곡면

여기서는 제일 마지막의 Catmull-Clark 극한 곡면에 대한 그림만 간단히 몇개 보도록 하겠습니다.





Catmull-Clark 극한 곡면은 무한히 접근할 수 없는 체귀 계산법을 사용합니다.


R600에서 Catmulll-Clark 극한 곡면을 이용해 얻어낸 효과입니다.


Tessellation의 순서도

R600 아키텍처에서 테셀레이션은 아주 중요한 기능입니다. 테셀레이션은 버텍스 쉐이더 이전에 위치한 테셀레이터에서 처리합니다.


기존의 순서도


R600에서는 테셀레이터가 버텍스 쉐이더 전에 위치하고 있습니다.

이렇게 테셀레이터가 버텍스 쉐이더 이전에 위치함으로서, 만들어낸 버텍스를 전부 버텍스 쉐이더의 처리와 연산에 참여시킬 수 있습니다.


Tessellation의 응용

R600은 XBOX360 Xenos GPU를 기본으로 하여 만든 것이라고 앞서 설명해 드린적이 있습니다. 따라서 XBOX360에서는 이미 테셀레이션을 지원하며 이를 이용한 게임도 출시된 적이 있습니다. 여기서는 그 중 하나인 Viva Pinata를 보도록 하겠습니다.



E 등급이라던가 딱 분위기를 보면 아시겠지만, 애들용 게임입니다. 허나 그래픽은 상당히 뛰어난 편입니다. 게임 내의 모든 모델에 사용된 텍스처는 '종이'같은 효과를 보여주고 있습니다.




이것들이 전부 테셀레이션이 사용된 화면입니다.

테셀레이션에서 제일 중요한 것은 뛰어난 시각 효과를 보여주기 이전에, 성능을 절약하여 프로그램의 실행 속도가 쾌적한 수준을 유지하도록 하는 것입니다. 아래는 테셀레이션과 자세하게 묘사된 폴리곤 모델의 성능 비교입니다.

 테셀레이션을 사용하여 세부 묘사를 한 모델 자세하게 묘사된 폴리곤을 사용한 모델 
기존 모델 삼각형 840개삼각형 1280038개
랜더링 길이 삼각형 1008038개 삼각형 1280038개 
버텍스 데이터 점유량 70KB 31MB 
색인 데이터 점유량 23KB 14MB 
소요 시간 821.41fps(1.22ms) 354fps(2.82ms) 

GDC2007에서 마이크로소프트는 차세대 다이렉트 X 표준의 구체적인 정보를 공개했습니다. 차기 버전인 다이렉트 X 10.1에서는 테셀레이션을 공식 지원할 것으로 보입니다.




CFAA를 이해하기 위한 기본적인 AA방식의 소개

GPU 제조사들은 GPU의 성능과 게임 화질을 개선하기 위해 노력하고 있습니다. 게임 API와 랜더링 모드를 고치지 않는다는 전제 하에, 제일 간단하고 또 효과가 좋은 화질 개선 방법은 바로 Full-Scene Anti Aliasing. FSAA입니다. 그냥 '안티 엘리어싱'이나 '안티', 혹은 AA라고 줄여서 말하기도 하지요. 이 기술은 계단 현상을 줄여줄 뿐만 아니라 표현 정밀도를 높여주기도 합니다.


무엇을 Anti Aliasing이라고 부르는가

컴퓨터 화면은 작은 점-픽셀-이 모여 이루어진 것입니다. 그 크기는 아주 작지만, 하나의 픽셀은 모두 화면의 특정 영역을 담당하고 있습니다. 여기서 '실시간' 처리가 가능하게 하는 랜더링 속도가 상당히 중요해지는데, 픽셀의 색은 모두 샘플링을 통해 얻어낸 색상 데이터에 따라 결정됩니다(Point Sampling). 하지만 속도를 높이기 위해 사용되는 이 방법은 한개 점의 색만 정의할 뿐, 특정 구역 전체의 색상 상황은 표현해 내지 못합니다. 따라서 이러한 픽셀들이 모여 이루어진 물체의 테두리가 매우 뚜렷하게 보일 수밖에 없는 것입니다.


검은색과 하얀색을 혼합하여 여러 단계로 나눠 변두리를 채우면 그 효과가 매우 뛰어납니다.

물체의 변두리 부분에서 픽셀들이 '구부러지게' 배열되어 있다면, 변두리의 양쪽은 완전히 다른 색이 사용되기 때문에 계단 현상이 매우 두드러지게 보일 수밖에 없습니다. 이 현상을 Aliasing이라고 합니다. 이때 변두리 부분 양쪽 모두의 색, 물체와 배경의 색을 혼합하여 다른 색을 만들어내 변두리 부분의 픽셀을 채워낸다면 이러한 계단 현상이 크게 줄어들어 보이기 됩니다. 이것이 바로 계단 현상(Aliasing)을 없애는(Anti) 원리입니다.


Super Sampling Anti Aliasing

초창기의 GPU는 모두 슈퍼샘플링 계산법을 사용했습니다. 지포스 256, 지포스 2, 라데온 7000, 라데온 7500, 부두 등이 여기에 포함되겠습니다.

슈퍼샘플링은 하나의 픽셀을 여러개의 픽셀로 분석해내어(Subpixel) 독립된 처리를 통해 캐시에 기록합니다. 슈퍼샘플링을 사용하면 그래픽 픽셀의 밀도와 평활도를 개선할 수 있으며, 이렇게 만들어낸 그림의 해상도는 실제 출력되는 해상도보다 상당히 큽니다. 따라서 SSAA를 사용하면 화질 개선의 효과는 상당히 좋았지만, 당시 GPU가 이를 처리할만한 성능은 되지 못했습니다.



슈퍼샘플링이라는 이 개념은 매우 단순한 것이지만, 이 방식은 지금까지도 계속 사용되고 있습니다. 나중에 등장한 여러 종류의 AA 계산법이 특수한 물체를 처리할 수 없다면 효율이 낮은 슈퍼 샘플링이라도 쓰는 것입니다. 슈퍼샘플링은 무손실 압축 계산이기 때문에 화질의 개선이 뛰어나지만 성능의 손실이 큽니다. 그래서 그리 많이 사용되진 않습니다.

슈퍼샘플링은 하나의 픽셀을 여러개로 나눠 샘플링하는 위치에 따라 Ordered Grid Super Samping(OGSS)과 Rotated Grid Super Sampling(RGSS)로 나뉩니다.



OGSS는 원래 화면을 확대하여 랜더링을 한 다음, 원래대로의 크기로 다시 줄여서 출력, 계단 현상을 없앱니다. RGSS는 원래 위치에서 일정 각도로 회전하여 계단 현상을 없앱니다. 약간의 회전만으로 OGSS보다 더 좋은 효과를 얻을 수 있다는 특징이 있습니다. ATI는 RGSS를 지원했고 NVIDIA는 원래 OGSS를 사용했지만, 나중에 NV40부터 RGSS가 추가됩니다.


Multi Sampling Anti Aliasing

슈퍼 샘플링은 성능 손실이 매우 크기 때문에 저해상도에서만 사용될 수 있고, 실제로 사용할만한 가치는 별로 높지 않습니다. 그래서 등장한 것이 바로 멀티 샘플링 방식입니다. 이 계산법은 픽셀에 샘플링을 하기 전에 먼저 픽셀의 위치를 알아내서, 모델의 변두리에 해당하지 않는다면 그냥 넘어가고, 변두리 부분만 샘플링 작업을 합니다. 이렇게 함으로서 AA 처리 과정에서 작업해야 하는 데이터의 양을 대폭 낮췄고 AA 화질을 높일 수 있게 됐습니다. 결국 이렇게 함으로서 MSAA는 AA 계산의 표준이 됩니다.



AA를 사용할때의 성능 저하는 화면에 표시되는 폴리곤의 숫자가 결정합니다. 따라서 MSAA 역시 성능 저하 수준이 상당히 있습니다만 그래도 기존보다 많이 줄어들게 되었습니다.

하지만 밀집되어 있는 나뭇잎, 풀, 철조망 등의 알파 텍스처를 사용한 오브젝트에서는 멀티 샘플링이 그 테두리를 인식하지 못하기 때문에 이 부분의 처리가 빠지게 됩니다. 따라서 GPU 제조사에서는 이 부분을 개선하기 위해 새로운 보조 AA 방식을 사용하게 되는데, NVIDIA의 Transparency AA(투명AA)와 ATI의 Adaptive AA(자체 적응 AA)가 바로 그것입니다. 위에서 언급한 멀티 샘플링이 처리를 빼놓는 부분에는 초과 샘플링을 하거나 강제적으로 슈퍼샘플링을 적용시켜 화질을 높이는 것입니다.


Temporal Anti Aliasing (ATI 전용)

ATI는 X800에서 Z 버퍼의 압축 효율을 높인것(AA 성능 향상) 외에도 Temporal Anti Aliasing이라는 새로운 모드를 추가했습니다. 이전까지의 AA는 포인트 샘플링을 사용한 것입니다만, Temporal AA(수직 동기화를 필요로 합니다)은 다른 샘플링 포멧을 사용합니다. 이 방식은 짝수와 홀수 프레임에 따라 샘플링을 하여 합성하는 방법을 사용하며, 사람의 눈에 잔상(Temporal)이 남는다는 것을 이용하여 실제로 표시되는 영상이 2배이기 때문에, 2x Temporal AA는 4x MSAA에 수준의 효과를 낼 수 있는 것입니다. 따라서 Temporal AA는 그 작업량이 보통의 AA와 같으면서도 화질은 한단계 높아지게 됩니다.



하지만 Temporal AA는 전제 랜더링되는 화면을 홀수와 짝수로 나눠 표시하기 때문에, 프레임이 낮을 경우 스크린이 깜빡거리게 됩니다. 실제 사용에서 fps가 60 이하라면 ATI 카탈리스트 드라이버는 자동으로 Temporal AA를 꺼버리고 일반 MSAA로 작동하게 합니다.


Temporal AA는 어떤 방식의 AA에도 같이 적용되어 사용할 수 있습니다.

지금 출시되는 게임들을 플레이할 경우, 일부 고급형 그래픽카드에서나 평균 60프레임 이상이 가능하기 때문에 Temporal AA는 수직 동기화를 사용한 상태에서나 쓸 수 있습니다. 따라서 그 사용범위는 비교적 좁은 편입니다.


Adaptive Anti Aliasing

MSAA는 자주 사용되는 기술이지만, 앞서 말한대로 알파(투명) 텍스처를 처리하지 못합니다. 그래서 철조망, 나뭇잎, 울타리 등의 가늘고 길다란 오브젝트에는 적용되지 않는데, 이를 해결하기 위해 NVIDIA는 지포스 7부터 Transparency AA를, ATI는 X1000부터 Adaptive AA를 지원하여 일부 부분에는 초과 샘플링을 하거나 강제적으로 슈퍼샘플링을 적용시켜 화질을 개선하게 됐습니다.


카탈리스트의 Adaptive Anti-Aliasing 설정 부분


왼쪽부터 4x 일반 멀티샘플링, 4x 어댑티브, 6x 어댑티브 AA입니다.

Adaptive AA는 알파 텍스처를 선택하여 전문적으로 멀티/슈퍼 샘플링을 진행합니다. 따라서 SSAA보다 성능 손실은 더 낮으면서도 더 뛰어난 효과를 볼 수 있습니다.


AA 레벨의 상승과 AA 모드 조합

GPU의 성능이 발달하면서 AA 레벨은 현재 8x까지 지원하고 있습니다. 하지만 더 높은 정밀도를 구현하기 위해 2가지 방법이 등장하게 되는데, 하나는 크로스파이어나 SLI를 구성한 그래픽카드가 각각 별도의 샘플링을 하여 나중에 합치는 것이고, 다른 하나는 MSAA+SSAA의 방식으로 AA 모드를 조합하는 것입니다. 이 두가지 방법은 이미 널리 쓰이고 있습니다.



크로스파이어를 구성했을 경우, 두개의 GPU가 다른 위치의 샘플링을 수행한 다음 나중에 이를 합쳐 8xAA(4+4)나 12xAA(6+6)를 만들어낼 수 있습니다. 이를 슈퍼 AA라고 하는데 아래에서 소개할 AA 모드 조합에 슈퍼 AA가 포함됩니다.

만약 크로스파이어같은 듀얼 그래픽카드로 8x나 12x AA를 만들어 낸 상황에서, 2xSSAA를 더한다면 14xAA가 나오겠지요. 여기서 SSAA의 배율이 낮은 이유는 앞에서도 말했듯이 SSAA의 성능 하락이 너무 크기 때문입니다.



NVIDIA는 예전부터 AA 조합 기술을 사용했습니다. 지금이야 둘 다 8xAA를 지원하지만, 예전에는 NVIDIA 쪽의 AA 배율이 더 낮았기 때문에 8xS모드(4xMSAA+2xSSAA)를 추가하여 AA 레벨을 더 높이기도 했습니다. 정확히 표현하자면 6xS가 맞겠지만 2xSSAA의 화질이 2xMSAA보다 훨씬 뛰어나 4xMSAA에 비슷한 수준을 보여줄 뿐더러, 알파 텍스처까지 지원했기 때문에 이를 8xS로 명명한 것입니다. 하지만 8xS의 성능 손실이 너무 크기 때문에 오래된 게임에서나 사용할 수 있는 수준입니다.

NVIDIA의 SLI를 사용하면 8xSLIAA(4xMSAA+4xMSAA)와 16xSLIAA(8xSAA+8xSAA=4xMSAA+4xMSAA+2xSSAA+2xSSAA)가 가능합니다. 하지만 ATI의 14x슈퍼AA와 비교할 경우, NVIDIA는 2번의 2xSSA를 처리해야 하는데 비해, ATI는 오직 한번만 하면 되기 때문에 처리량이 상당히 차이가 나고, 16xSLIAA의 효율이 떨어지는 원인이 됩니다. 그래서 실제로는 8xSLIAA가 사용되지만 이것 역시 ATI의 10x슈퍼AA나 12xAA보다는 떨어지는 방식입니다.


지포스 8의 Coverage Sampled Anti Aliasing. CSAA

이전 세대의 NVIDIA GPU는 ATI의 6xMSAA보다 낮은 4xMSAA를 지원했습니다. 8xSAA의 성능은 낮았고 16xSLIAA도 비슷한 문제가 존재했습니다. 따라서 NVIDIA는 지포스 8부터 이들 문제를 대폭 개선, 컬러 샘플링 숫자를 8개로 늘려 8xMSAA를 직접 지원하고, 샘플링 적용 범위(coverage)를 16개로 늘려 8xCSAA, 16xCSAA, 16xQAA 등의 다양한 모드를 지원하게 됐습니다. 이중에 효율이 제일 높은 방법이 바로 8xCSAA와 16xCSAA입니다.

NVIDIA 지포스 8 시리즈의 AA 모드
AA 모드2x 4x8x 8xQ 16x 16xQ 
색채/심도 샘플링 수2
적용 범위 샘플링 수16 16 

지포스 8의 CSAA는 16/8배의 적용 범위를 그대로 유지하면서 4개의 심도치와 색상 수치만 저장하면 됩니다. 따라서 메모리 대역폭이 받는 압력이 상당히 줄어들게 되고 AA 효율이 대폭 늘어나게 되는 것입니다.


포스웨어에서는 8x(CS), 8xQ(MS), 16x(CS), 16xQ(CS)의 4가지 새로운 AA 모드를 지원합니다.

색상 정보와 깊이 정보를 4번만 샘플링하면 되기 때문에 8xCSAA와 16xCSAA는 일반 4xMSAA보다 성능 손실이 아주 적지만, 화질 개선 효과는 매우 뛰어납니다. 만약 지포스 8800GTX나 울트라같은 고급형 그래픽카드를 사용한다면 8xQ(8xMSAA)와 16xQ(8xMSAA에 8xCSAA)같은 고해상도 모드를 직접 체험할 수 있습니다.


제로보드 용량 제한 때문에 3부는 여기까지입니다. 작성이 끝나는대로 4부를 올리도록 하겠습니다.
기글하드웨어(http://gigglehd.com/zbxe)에 올라온 모든 뉴스와 정보 글은 다른 곳으로 퍼가실 때 작성자의 허락을 받아야 합니다. 번역한 뉴스와 정보 글을 작성자 동의 없이 무단 전재와 무단 수정하는 행위를 금지합니다.