당신의 눈을 부시게 하는 것을 제외한 기본적인 3D 그래픽 - 출발하기에 충분하다.

머릿말

비디오 카드 기술은 계속적으로 진보하고 있다. 언제나 새로운 무엇인가가 박힌 돌을 빼내고 있다. 주어진 비디오 카드 능력의 기본적인 기술을 이런 기술 세대를 확인함으로써 알아낼 수 있다. 비디오 카드 세대를 구분하는 방법은 여러가지가 있지만 가장 공통적으로 쓰이는 것이 비디오카드가 어떤 버젼의 DirectX를 지원하도록 설계 되었는지에 대하여 구분하는 것이다. Direct X 버젼은 이전 버젼을 위해 하위 호환성이 보존된다. 이것이 의미하는 것은 DirectX 9 카드는 Direct X 8이나 그 이전 버젼의 Direct X에 기반하여 설계된 카드에서 할 수 있는 일을 모두 해낼 수 있다는 것을 의미한다. 이것은 더욱 새로운 그래픽 하드웨어로 오래된 그래픽 프로그램을 실행시킬 수 있게 한다.

당신은 아마 당신 컴퓨터 내의 메인 프로세서 칩이 CPU라고 불리우는 것을 알 것이다. 이것은 대부분의 연산력을 부담하고 있으며 이것으로 인해 Intel을 굉장하게 배불려주고 있으며 AMD는 이따금씩 겨우겨우 수지타산을 맞추게 한다. CPU들은 제약없이 유연한 컴퓨팅 괴물들이어서 당신의 컴퓨터에서 아주 많은 일들을 할 수 있게 하는 수용력의 원천이 되게 한다. CPU들은 프로그램이 가능하다. 딱 올바른 프로그램을 로드 하기만 하면 CPU가 뭔가 해내게 할 수 있다. 비디오 카드들은 그들 고유의 메인프로세서를 가지고 있는데, 이것은 GPU라고 부른다. Nvidia와 ATi는 비디오 카드 상에서 찾을 때 GPU의 가장 큰 메이커이다. Intel은 대부분 메인보드 내장설계에서 사용되는 내장 비디오용 GPU를 제조하고 있다. GPU는 CPU만큼 유연하지는 않다. GPU들은 우선적으로 이미지 생성에 주안점을 두고 설계되었다. GPU는 2개의 아주 다른 작업을 하게 된다. : 2차원 그래픽(2D)을 그리고 3차원 그래픽(3D)을 그린다.

2D 그래픽은 Windows XP에서 사용되는 사용자 인터페이스를 그리는 것 같은 때에 사용된다. 워드프로세서와 웹 브라우저 또한 2D 모드에서 작동한다. 2D 그래픽을 그리는 것은 아주 약간의 준비된 이미지를 스크린으로 카피하고, 다양한 폰트에서 끌어온 문자를 그리며, 스크린의 영역을 색으로 채우는 것으로 주로 구성된다. 이것은 아주 기본적인 부분이며 심지어 꽤 오래된 비디오 카드들도 빛의 속도로 2D 그래픽을 그리는 것에는 충분히 강력하다. 당신이 사용 하는 것이 모두 2D 그래픽 관련이라면, 어떠한 GPU도 할 수 있다.

3D 그래픽은 게임에서 사용되는데 플레이어로 하여금 (물건을 쏘고, 폭발시키고, 훔치는 등의 모든 재미있는 것들을 포함한) 가상 세계를 돌아다니는 것을 가능하게 한다. 3D는 예술가로 하여금 디자인을 하고 그들이 디자인 한 것을 볼 수 있게 하는 예술 관련 프로그램에도 쓰인다. 이것은 또한 많은 엔지니어링과 설계 프로그램에도 쓰인다. WIndows Vista는 3D 유저 인터페이스를 지원할 것이다. 2D 그래픽과는 달리, 3D 그래픽은 엄청난 양의 연산능력을 요구한다. 그리고 3D에서 더 빠른 GPU로도, 이미지 품질이 향상되는 만큼 훨씬 많은 연산력을 필요로 하게 된다. 대부분의 2D 잡일을 소화해 낼 수 있는 GPU라도 사람들은 항상 더 좋은 3D 연산력을 필요로 한다. 그리고 심지어 현재 3D 프로그램에서 충분히 빠르다고 할지라도, 근미래에 곧 배포될 새로운 프로그램은 더 강력한 3D 연산력을 필요로 할 것이다.

3D의 기본 이해

3D 기술에는 신비한 것들이 엄청나게 많다. : 픽셀, 점, 폴리곤, 지오메트리, 쉐이더, 범프매핑, 등등등등... 끝이 없다. 그리고 심지어 이것들을 다 배우더라도, 이것들은 또 새로운 내용들이 첨가되어 또다시 혼란의 연속을 겪게 한다. 엄청나게 수준있고, 수학으로 가득찬 두꺼운 책들이 3D의 세부사항을 설명하지만 여기의 요점은 3D의 기본에 첫 발걸음이다. - 당신만의 3D게임을 만들어내려 시작하는 것이 아니다. 이 페이지는 몇몇개를 아주 단순하게 하기 때문에 많은 세부사항은 넘길 것이다. 이것은 단지 기본일 뿐.

DirectX 6

기본적인 틀을 위해, 약간의 GPU에 대한 이전 역사에 대해서부터 시작하자. : 바로 Direct X6부터. DirectX 6은 1998년에 배포되었다. 일반인들이 Direct X 6 비디오 카드를 사는 유일한 방법은 중고 하드웨어를 파는 것 뿐이었다. 엄격히 말해, 비디오 카드 상의 주 연산 칩은 Direct X7 까지는 GPU라고 불리우지도 못하였다. Direct X6에서의 3D 수용 능력은 아주 기본적인 기능만이 가능하였다. 이것들은 vertex-lit, multi-textured, bump-mapped polygon 만을 그려낼 수 있었다. 이 용어들의 의미를 모른다 하더라도 그렇게 걱정하지 말라.

wireframe.jpg

GPU는 3D 물체를 그것의 표면을 그려내는 방법으로 구현한다. 실세계의 물체 표면의 모양은 아주 복잡해진다. GPU는 충분한 삼각형들로 모든 표면들을 덮으며 이로 인해 아주 괜찮은 수준의 근사치를 가질 수 있다. 왼쪽 이미지는 테이블의 와이어 프레임 모델을 보여주고 있다. 와이어프레임 모델은 GPU가 물체의 표면을 모델링 하는 데에 사용하는 삼각형들의 모서리 부분을 보여준다. 이 모델에는 아주 극소수의 삼각형이 쓰여서 각개 삼각형들을 인식하는 데에 약간 어려움을 느낄 수 있다. 그러나 좀 더 유심히 보면, 각개 삼각형을 찝어낼 수 있을 것이다. 이것들을 모두 합하면, 모든 이 삼각형들이 테이블의 모든 표면을 덮고 있다는 것을 알 수 있다.

가끔 3D 모델에 대해 읽다 보면 삼각형 보다는 폴리곤들로 구성되었다는 글을 읽을 수 있다. 폴리곤은 단순히 3개 이상의 모서리를 가진 납작한 물체일 뿐이다. 고차원적인 표면으로 이루어진 모델도 역시 존재 한다. 그것들의 점들은 곡면을 1개 납작한 면으로 정의하게 할 수 있다. 그러나 우리는 여기에서 삼각형의 집합으로만 다룰 것이다. 삼각형은 가장 단순한 모델이어서 이런 종류의 글에서 다루기에 딱 알맞은 글이다. 실제로, 대부분의 사람들은 삼각형으로 이루어진 것들과 대면한다. 간단히 말하기 위해 많은 내용들은 마음에 담아두겠다.

테이블의 윗부분은 둥근 것으로 추측되나 실제적으로 24개의 모서리를 갖고 있다. 테이블의 삼각형의 갯수가 줄어듦으로 해서 만들어진 숫자이다. 많은 숫자의 삼각형으로 테이블을 모델링 한다면 이것의 모양은 실제 물건과 가상적으로 구분못할 수준까지 도달할 수 있다. 윗 모델은 DirectX 6 영역의 게임에서 찾을 수 있는 테이블에서 가장 많은 삼각형을 사용한 것이라고 예상할 수 있다. 게임에서는 게임이 바로 반응할 수 있을 만큼 빠르게 스크린 이미지를 반복적으로 재구성해야 하기 때문에 삼각형의 숫자에는 제한이 따른다. 게임은 초당 30프레임 정도의 프레임 레이트를 필요로 하며 이렇지 않으면 느리다는 인상을 받게 된다. 이것은 게임이 그들의 완전한 3D 장면을 초당 30번(또는 그 이상) 재구성해야 한다는 것을 의미한다. 그리고 스크린 상에는 단지 테이블 달랑 하나 있는 것보다 훨씬 많은 것을 그려내야 한다. 만약 고전 게임을 실행하여 레고 블럭 같은 것으로 만든것으로 보이는 우주 해병의 웃기게 생긴 머리를 보고 움찔 하였다면, 이제 이것이 '왜' 이런 것인가를 알아야 한다. 이것은 또한 왜 게임에서는 주변에 많은 상자들을 쌓아놓는지에 대한 설명도 된다. 상자들은 아주 적은 삼각형을 사용한다.

3D 미술 관련 작업을 한다면 당신의 테이블 모델링은 더 많은 삼각형을 갖게 할 수 있다. 아티스트들은 그리는 속도에 관한 것보다 이미지 품질에 훨씬 더 주안점을 두려는 경향이 있어 그들이 만드는 테이블은 위에 보여진 것보다 훨씬 더 보기 좋다.

삼각형의 위치는 삼각형 3개 코너의 위치를 규정하는 것으로 정의가능하다. 각각의 코너들은 vertex라고 불린다. Vertice는 Vertex의 복수형이다. 그리스 인을 탓하라. 내가 만든 단어가 아니다. ("datum"이라는 단어를 사용하는 사람이 있긴 한가?) "지오메트리" 라는 단어는 전체의 엄청난 점들을 묘사할 때 쓰인다. 이 테이블의 지오메트리는 실제적으로 테이블 표면의 모양을 정의하는 점들의 리스트를 의미할 뿐이다. 점들은 고정된 위치에 머무는 것을 요구받지 않는다. 이것들은 이동이 가능하다. 몇몇 점들의 위치를 옮김으로써 테이블의 이동을 표현할 수 있다. 테이블 다리의 바닥의 16개 점을 고정된 채로 유지하고, 모든 다른 테이블 상의 점들을 1방향이나 다른 방향으로 옮김으로써 테이블을 불안하게 보이도록 만들 수 있다. 아니면 적당한 방향으로 지오메트리의 다양한 부분을 옮김으로써 테이블을 걷게 할 수 있다. Direct X 6 비디오 카드 내에서, CPU는 이런 종류의 연산을 할 의무를 지고 있다. GPU는 그들 혼자서는 이런 일을 할 수 없다.

가끔씩 아주 오래된 고전 게임들은 와이프레임 모델을 디스플레이에 쓰기도 한다. 이것들은 아주 그리기가 쉽다. 그러나 물체들에 겉표면을 입히지 않는다면 이것은 계속 현실적으로 보이지 않을 것이다. 위 이미지의 오른쪽의 테이블은 삼각형의 표면에 딱 맞는 텍스쳐 맵을 가졌다. 텍스쳐 맵은 어떤 무엇인가의 이미지이다. 이 경우, 텍스쳐 맵은 나무 조각의 이미지이다. GPU는 각기 삼각형의 표면에 나무의 이미지를 그림으로써 테이블이 마치 나무로 만든것 같게 보이게 한다. 텍스쳐 맵은 어떠한 종류의 이미지로도 가능하다. 이것은 대리석 무늬나 당신의 고양이 그림도 될 수 있다. 당연히, 테이블 표면에 찍힌 당신의 고양이는 꽤 괴상할 것이다. 그러나 3D 모델에 당신의 고양이 그림이 딱 맞게 들어간다면 아주 괜찮을 것이다. 딱 알맞은 텍스쳐 맵이 모델에 적용된다면 아주 현실적인 것처럼 보일 것이다.

오른쪽 테이블을 유심히 본다면, 이미지 내의 빛이 위에서 내려와 테이블의 오른쪽으로 가는 것이 나타난다. 이 빛이 없으면, 테이블의 이미지는 김빠지게 보이며 비현실적으로 보이게 된다. 이 빛은 vertex lighting라고 불리우는 기술이 접목된 것이다. Vertex Lighting은 (가상적인) 빛의 위치와 (그려지는 이미지를 보기 위해 서 있는) 관찰자의 위치를 고려하며 이때 어떻게 빛이 각기 점에 밝혀질 것인지를 계산하게 된다. 이것은 GPU가 어떻게 각기 삼각형중 비추어야 하는 세 점을 어떻게 밝히는 것인가를 말해주는 것이다. GPU가 삼각형을 그릴 때 이것은 각기 점을 vertex lighting이 정한 정도의 밝기를 적용하며 각기 코너의 빛 차이를 자연스럽게 전이시키기 위해 삼각형의 나머지 공간을 채우게 된다. 1개 코너가 다른 두 코너보다 밝다면 이 삼각형은 그 점에서는 좀 더 밝아 보이며 다른 두 점에 다가갈수록 점진적으로 어두워지게 될 것이다. 그리고 이것은 1개 광원에만 국한된 것이 아니다. 좀 더 많은 연산을 해야 함에도 다수의 광원에서도 같은 계산이 가능하다. 또한 색조가 첨가된 빛을 사용할 수도 있으며 다른 흥미로운 광원 효과도 넣을 수 있다. 이런 종류의 광원은 간단하게 넣을 수 있는 것을 고려하면 아주 괜찮은 것이다. 단지 이것은 몇몇 광원 정보를 각기 점에서 연산하며 GPU는 이것에 관련하여 나머지 삼각형 부분에 정보를 채우게 된다.

2.jpg

DirectX 6은 또한 3D 물체의 표면을 밝게 하거나 어둡게 만드는 light map 이라고 불리우는 것과 혼합이 가능하다. Light map은 그림자를 만들기 위해서도 쓸 수 있다. 몇몇 게임은 왼쪽 스크린 샷에 보이는 것처럼 괴상한 환경을 만들기 위해 나오는 그림자로 인해 약간 과부하를 겪기도 한다. 여기에는 비록 표면이 여전히 완벽하게 평평한 삼각형의 집합일지라도 물체의 표면을 울퉁불퉁하게 보이게 하는 bump maps라는 것도 존재한다. 오른쪽 아래 이미지 같이 bump map이 적용된 지구를 볼 수 있다. 다른 종류의 map 들도 역시나 존재한다. 텍스쳐 맵은, 더욱 더 현실적으로 보이게 모델의 표면에 여러가지 종류의 이미지를 적용하는 것이다.

텍스쳐 맵(과 다른 종류의 맵들) 은 실제적으로 무엇인가를 그리는데 있어 요구되는 연산량을 상당량 줄이는 방법 중 하나가 된다. GPU는 실질적으로 나무의 표면 내의 모든 미묘한 결 들을 포함한 테이블의 실 표면을 구현하는 데 있어 아주 열심히 작업해야 한다. 이 테이블은 완벽하게 평평하지는 않다.

그러나 GPU는 구현에 최소한도로 사용할 수 있는 삼각형을 사용함과 동시에 표면에 붙일 몇몇 나무의 그림으로 아주 현실에 근접하게 그려낸다. 그리고 이 후 여기에 범프 맵을 적용하여 여기에 마치 실제적으로 테이블의 표면 상에 나뭇결이 있는 것 같이 보이게 한다. 이것이 당신이 계속적으로 봐왔던 3D 그래픽의 주된 주제이다. : 연산 상에 "속임수"를 찾는 것이다. 물체의 표면에 실제로 구현하는 것은 엄청나게 많은 연산량을 요구하여 비디오 카드는 이런 모든 작업을 제외하고서도 근접한 효과를 내는 방법을 찾는 것이다. 이런 방법들은 영리하게, 그려질 때마다 재연산하지 않고 복잡한 표면을 빠르게 그려낼 때 사용되는, 다양한 종류의 미리 연산된 맵들에 연관되기도 한다.

DirectX 7

DirectX 7은 1999년도에 배포되었다. 2006년 말 현재, 아직 DirectX 7  카드들이 초저가 비디오 카드들로 팔리고 있다. 이들의 3D 구현 능력은 DirectX 6에 비해 성능상으로 엄청나게 향상되었다. 세간의 이목을 집중시킨 DirectX 7 비디오 카드는 Nvidia의 Geforce 256 이었다. 이것은 "GPU"라는 단어의 시발점이 되었다. 사실, GPU라는 단어는 원래 Nvidia의 마케팅 부서에서 밀어 준 것이었다. 그러나 얼마 있지 않아 모든 이들이 같은 종류의 기능을 가져왔으며 GPU는 일반적인 단어가 되었다.

이전에 보여준 이미지를 표시하기 위해서는 각기 점에서 완료 되어야 할 아주 많은 연산들이 요구되었다. 물체를 움직이려면 몇몇 점들을 옮겨야만 한다. 스크린 상의 어디에 각기 점들이 있는지를 밝혀 내야만 한다. 각기 점 상에서 광량을 계산하여야 한다. (최소한, 여기까지 하면 보통 과정이 끝난다.) 이제 모든 점에 대한 계산이 끝나면, 이제는 모든 가시 가능한 삼각형을 표시하여야 한다. DirectX 6에서는, CPU가 모든 점 계산을 하며 GPU는 삼각형의 표시만 하는 책임을 졌었다. 이들 점 계산은 많은 수의 삼각형으로 만들어진 멋진 모델을 만들기를 원한다면 CPU에 부하를 가중하게 된다.

DirectX 7은 하드웨어 변형과 광원(hardware TnL)을 소개하였다. 이 "변형" 부분은 계산을 나타내는데 점의 위치와 연관되어 있으며 광원 파트는 각기 점에서 완료되는 광량 연산을 나타낸다. TnL을 가진 GPU는 CPU에 의무를 떠넘기던 점 계산을 GPU가 하게 된다. 이것은 아주 좋은 것인데 CPU에서 이런 연산을 한다고 해서 아주 빠르지 않았기 때문이다. 만약 GPU 내의 하드웨어 TnL이 빠르다면 이것으로 인해 더 작은 삼각형을 많이 사용하여 모델을 만들어내 이들의 모양은 좀 더 현실적이 될 것이다. 모든 비디오 게임의 우주 해병은 이제 더이상 머리가 레고 블럭마냥 네모진 모양을 하지 않아도 되는 것이다. 그리고 광원은 더 작아진 삼각형으로 만들어진 물체를 좀 더 보기 좋게 만든다. 기본적으로, 많은 삼각형은 좀 더 모양을 좋게 하지만 더 많은 삼각형이라 함은 더 많은 점 계산을 의미하기도 한다. Hardware TnL은 더 많은 삼각형을 사용하게 하였다.

쉐이더 이전의 생활

얼마나 쉐이더가 중요한지 이해하기 위해서는, DirectX의 이전 버젼으로 다시 되돌아가 볼 필요가 있다. DirectX 7과 그 이전 버젼은 고정된 기능의 3D 파이프라인이라고 알려진 것을 사용하였다. 개인적으로, 나는 이것을 3D의 "속임수의 가방" 이라고 부르고 싶다. 이제 이 속임수라고 규정한 것을 자세히 보도록 하자. 그러나 이러기 전에 앞서, 당신은 약간의 전문용어를 알아야 한다. 이미지는 실제적으로 아주 작은 상자의 모음으로 구성되는데, 각각의 것들은 1개의 색을 저장하고 있다. 이들 작은 상자들은 픽셀이라고 불리운다. pixel은 picture element의 약자이다. 오래된 디지털 카메라로 당신의 개를 찍어본다면, 이것은 640*480 픽셀의 해상도의 사진으로 찍을 것이다. 이것은 개의 이미지가 실제로 640 픽셀의 폭과 480 픽셀의 높이를 가진 픽셀의 2차원 배열이라는 것이다. 이것은 모두 307,200 픽셀이다. 각각의 작은 픽셀들은 1개의 색만 갖고 있지만 (적당한 카메라로 찍었다면) 이것은 개같이 보인다. 이제 픽셀의 색이라는 주제에 맞추어 갈 필요가 있다. 우리가 본 색을 표현하는 방법은 해당 색을 3개의 분리된 요소로 분해하는 것이다. : 빨강요소, 녹색요소, 그리고 파랑요소로. "RGB"라는 단어가 생각난다면, 이것이 우리가 말하려는 것이다. : 빨강, 녹색, 그리고 파랑. 각각의 색 요소는 0.0에서 1.0 사이의 값을 가진다. 1.0 값의 빨강 요소는 완전한 빨강을 의미한다. 0.5의 빨강 요소 값은 반 빨강이며 0.0은 빨강이 전혀 안들어갔다는 것을 의미한다. 초록과 파랑 또한 그들 고유의 값을 색이 없는 0.0에서 완전한 색인 1.0 까지 가지고 있다. 예를들어, 0.8의 빨강, 0.6의 초록, 그리고 0.4의 파랑은 밝은 갈색의 색을 부여하게 된다. 빨강이 0.0, 초록이 0.4이며 파랑이 0.4 일 떄는 어두운 청록색을 가지게 된다. 어떠한 색이라도 이런 방법으로 표시할 수 있다. 색 요소는 1.0에 가까울수록 밝은 색 계열의 결과를 나타내며 0.0의 값에 가까울수록 어두운 색 계열의 결과를 가져온다. 이것이 관심있다면,
http://en.wikipedia.org/wiki/RGB_color_model
이 페이지에서 더 많은 것을 얻을 수 있다. 그러나 기본적으로, 1개 색을 유지하기 위해서 이 세가지 분리된 것의 숫자는 0.0에서 1.0까지의 영역을 준수하여야 한다. 그러므로 개의 사진은 실제적으로 긴 길이의 숫자로 이루어진 것이다. 이것은 307,200 픽셀들의 리스트인데, 각개 요소는 0.0과 1.0 사이의 값을 가진 3개의 색으로 데이터를 유지하게 된다.

자 이제 이 가방 안의 트릭 중 하나를 분석해보자. 윗 스크린 샷의 어둡고, 그림자 져있는 부분을 보자. 이 방의 표면 모양은 우리 테이블에서 했던 것 같은 삼각형으로 모델링 되어 있다. 이것은 단지 테이블 대신 방의 모양을 꾸민 것에 불과하다. 그리고 모든 벽, 천장, 마루 등등의 이 방 내의 것들은 우리 테이블을 덮고 있는 나무 텍스쳐 맵 같은 다양한 더러운 공장 같은 텍스쳐 맵으로 덮혀져 있다. 그러나 이 방은 어두운 부분과 밝은 부분을 갖고 있다. 그리고 방의 몇몇 부분은 빛이 깜빡거릴 때 같이 밝혀졌다가 어두워진다. (이런 종류의 비디오 게임에서는 분위기 때문에 빛은 거의 없다.) 비디오 게임이 우리의 테이블을 그릴 때 이것은 그냥 나무 텍스쳐 맵을 덮는다. 게다가 위의 텍스쳐된 테이블 이미지 같은 경우, 이것을 멋지게 만들기 위해서는 단순 vertex lighting 만이 필요하다. 그러나 이런 더러운 주어진 방에선 vertex lighting으로 작업할 훨씬 더 복잡한 광원과 그림자를 가졌는데 여기에서는 더 큰 삼각형으로 만드는 것이 낫다. 벽이 2개의 삼각형으로 만들어졌다면, 괜찮은 모양의 그림자를 내기 위해 vertex lighting을 사용하는 것과 벽에 다수의 집광을 사용할 수 없다. 모든 vertex lighting은 삼각형의 점에서의 빛을 제어할 수 있으며 GPU는 점 사이의 빛을 채우게 된다. 그러므로 괜찮은 빛과 그림자로 이런 더러운 방을 그릴 수는 있지만 여전히 다른 방향의 접근을 하기 위해서는 약간 수의 삼각형을 사용해야 한다. GPU가 이런 더러운 게임 내 방의 벽을 그릴 때, 실제적으로 2개의 맵을 사용한다 : 더러운 공장 벽 텍스쳐 맵과, 그림자가 위치할 곳에 덧씌워지는 이미지를 포함한 라이트 맵이다. GPU는 수학적으로 벽 텍스쳐 맵을 라이트 맵과 혼합시켜 최종적으로 그림자가 포함된 그림자 진 벽을 만들게 된다.

3.jpg

위의 이미지로 좀 더 쉽게 볼 수 있다. 왼쪽의 이미지는 벽 부분을 덮는 텍스쳐 맵이다. 벽돌을 바꿔 보았는데 액션 게임을 질리도록 하여서 이런 더러운 공장 느낌은 질렸기 때문이다. 텍스쳐 맵은 완벽하게 빛이 들어가있어 어떠한 그림자도 있지 않다. 중간의 라이트 맵은 벽이 밝은지 어두운지에 대한 부분을 제어하게 된다. 이 특별한 라이트 맵은 2개의 점광이 만든 2개의 빛 영역을 갖고 있으며 나머지 맵 부분은 그림자이다. 오른쪽의 이미지는 GPU가 텍스쳐 맵과 라이트 맵을 혼합하였을 때의 결과 이미지이다. 이것은 벽돌 벽을 두개의 빛이 비추는 것 같이 보인다. 벽돌 텍스쳐 맵 내의 픽셀이 3개의 요소로 이루어져있다는 것을 기억하라. : 빨강, 초록, 그리고 파랑. 각각의 값들은 0.0과 1.0 사이의 값으로 이루어져 있다. 라이트 맵은 실제적으로 흑백 이미지로 이것은 1개의 요소(하양) 만을 갖고 있지만 여전히 0.0과 1.0 사이의 값이다. GPU가 벽돌 텍스쳐 맵과 라이트 맵을 혼합하는 방법은 아주 간단하다. 텍스쳐 맵 내의 픽셀에서 3개 색 요소의 각기 값을 가져와 이들이 상응하는 라이트 맵 내의 픽셀 값에 곱한다. 이것이 끝이다. 1번의 곱셈만 한다. 라이트 맵은 그림자 내의 벽 부분에는 0.3 같은 값을 가지고 있다. 벽돌 벽 텍스쳐 맵의 한 곳의 3개 색 요소를 갖고 와서 각각 0.3을 곱한다면 더 어두워진 최종 색을 갖게 될 것이다. 라이트 맵에서 그림자가 없는 벽 부분의 1.0 값을 갖고 있다. 벽돌 텍스쳐 맵에서의 색과 곱할 때 1.0을 곱하여 결과적으로 같은 색을 가지게 된다. 그러므로 텍스쳐 맵의 각기 점에서는, GPU는 라이트 맵 내에서 상응하는 점을 곱하여 벽의 그림자 부분 내에서는 어두워진 최종 색을 얻게 되고 그림자가 없는 부분에는 완벽히 빛을 받은 부분이 생성되게 된다. 수학적으로 말한다면, 텍스쳐맵과 라이트 맵을 곱하면 최종 결과를 얻게 되는 것이다.

벽 텍스쳐 맵 내의 각기 픽셀의 곱셈을 완료하는 것만으로 모든 종류의 멋진 그림자를 만들어낼 수 있다.  그러나 이 길게 준비한 설명의 요점은 어떻게 이런 그림자가 빨강, 초록, 그리고 파랑 색 요소 상에서의 수학적 연산으로 실제적으로 나오는지를 설명하기 위한 것이었다. 이제 색을 어둡게 하기 위해 할 것은 1.0 미만의 숫자로 곱하는 것이다. 0.8 을 곱함으로써 색은 조금 어두워지며 0.2를 곱하면 훨씬 더 어두워진다. 이것이 GPU의 속임수의 가방 내에서 이루어지는 수학적 속임수 중 하나이다. : 텍스쳐 맵을 라이트 맵으로 곱함으로써 그림자를 생성하는 것. 또다른 많은 종류의 속임수들이 있다. 당신은 멋진 효과들을 몇번의 곱셈과 덧셈으로 만들 수 있다는 것에 대해 아주 신기해 할 것이다. 위의 범프 매핑된 지구 이미지는 GPU가 텍스쳐 맵과 범프 맵을 혼합하기 위해 약간의 수학을 하는데 약간 더 복잡한 연산이 필요하다. 만약 당신이 텍스쳐 맵과 범프맵 상에서 몇번의 덧셈과 곱셈을 한다면 울퉁불퉁한 부분의 색 변화를 볼 수 있을 것이다. 여기에는 물체를 빛나게 만드는 속임수도 있다. 물체 주위를 반사하는 물체를 그리기 위해 텍스쳐 맵과 다른 종류의 맵을 혼합하는 속임수도 있다. 모두가 원하는 속임수들이 이 가방 안에 모두 있다.

쉐이더의 시간

비디오 카드 분야의 어느곳을 보더라도 쉐이더라는 단어는 튀어나올 것이다. 픽셀 쉐이더, 버텍스 쉐이더, 그리고 언젠가는 지오메트리 쉐이더도 나올 것이다. 쉐이더, 쉐이더, 쉐이더. 쉐이더가 무엇이길래 이 난리인가? 오래된 GPU의 속임수 가방 디자인은 원하는 시각 효과를 얻기 위해 미리 설계된 수학적 속임수의 모음을 혼합하는 방법을 찾아야 했다. 텍스쳐 맵과 라이트 맵에 1개의 수학적 속임수를 적용하여 괜찮은 빛을 생성해냈다. 표면이 울퉁불퉁하게 보이게 하기 위해서는 범프 맵으로 또다른 속임수를 적용하였다. 게다가 우리가 다루지 못한 많은 다른 속임수들이 많다. 1개 속임수를 적용 후에 당신이 얻기를 원하는 또다른 효과를 또 적용하지만 누군가가 설계한 디자인에 의해 한계에 부딪히며 모두 같은 속임수의 가방에서 한계에 부딪히게 된다. 이것이 왜 같은 속임수 가방에서 그려낸 모든 3D 이미지가 비슷한 종류로 보이는 지에 대한 답변이 된다. 그리고 이 가방안에 없는 속임수를 원한다면, 어찌할 수가 없다.

잘 가라 속임수의 가방. 이제 쉐이더다. 이 새로운 쉐이더 GPU 설계는 당신으로 하여금 GPU 상에서 동작하는 쉐이더라고 부르는 간단한 프로그램을 쓸 수 있게 하며 당신의 마음대로 원하는 간단한 수학적 계산도 수행할 수 있게 된다. GPU 기반 쉐이더는 프로그램 가능하다. - 메인보드 상의 CPU가 프로그램 가능한것과 아주 유사하다. 적합한 쉐이더 프로그램을 로딩하는 것으로 거의 모든 계산을 쉐이더 GPU를 통해 수행할 수 있다.

그림자, 요철표면, 광채나는 표면, 그리고 이런 종류와 관련된 모든 것을 그리는 특정 종류의 쉐이더는 : 픽셀 쉐이더가 관여한다. 픽셀 쉐이더는 GPU상에서 동작하는 작은 프로그램으로 한개 픽셀의 색을 계산한다. 이것은 텍스쳐 맵, 라이팅 맵, 그리고 다른 종류의 맵에 접근하는 것이나 결과 픽셀의 색을 계산하기 위해 약간의 수학적 계산을 하는 표준적인 수행을 한다. 이것은 예쩐의 가방에서 하였던 모든 종류의 속임수를 수행할 수 있다. 이 오래된 속임수들은 각기 픽셀의 세트에서 한 것과 동일하지만, 픽셀 쉐이더는 더욱 진보된 종류로 각 픽셀마다 다른 계산을 수행할 수 있다. 이 새 픽셀 쉐이더는 아주 유연성이 좋아 GPU 프로그래머가 이것을 어떻게 쓰는지를 예측하는 것은 아주 어렵다. 그 당시, 그들은 이런 쓰레기로 그들이 생각해낸 묵시록적 공업 황무지를 빛나고, 요동치고, 그리고 주변의 무너질 것 같은 빌딩의 반사를 표현하는 것에 만족한 듯 보였다. 아 그렇다... 그리고 돌연변이들은 더욱 현실적으로 보이는 피부를 갖게 되었다. 그렇다. 이런 것들이 돌연변이를 그릴 때 모든 것을 바꾸어 놓았다. 사람들이 쉐이더로 인해 일어날 멋진 것들에 대해 말할 때, 그들은 미래에 일어날 상상하지 못한 것들에 대해 보통 이야기 한다. 이 소리는 현재 단지 빛만 비추고 요철만 주는 것 들보다 훨씬 인상적인 것이다. 그러나 아직은 마음속에 담아두고 누군가가 멋진 새로운 효과를 갖고 올 때까지 기다려야 한다. 나는 아직 텍스쳐 맵이 나왔을 때를 기억한다. 그래... 텍스쳐 맵 이전의 생활도 있었다. 그러나 그것은 그렇게 좋아보이진 않았다. 그리고 그 당시 그들은 라이트 맵, 범프 맵, 환경 맵 등도 갖고 있었다. 그리고 대부분의 시간에 그들은 새로운 속임수를 가지고 왔는데, 그들은 빠르게 그릴 새로운 세대의 하드웨어를 만들어야 했다. 쉐이더는 이 모든 것을 불식시켰다. 쉐이더로 인해, 당신은 거의 모든 효과를 만들고 그것들을 사람들이 이미 갖고 있는 쉐이더 기반 GPU 상에서 동작시킬 수 있게 되었다. 이 새로운 효과를 사용하기 위해 새로운 비디오 카드는 필요치 않았다. 생각 했던 것보다 더 많은 연산을 필요로 했다면 빠르게 그리기 위해 화면 해상도를 줄여야 했지만, 최소한 이것은 이렇게 시도라도 가능했다. 그러므로 쉐이더는 좀 더 좋아보이는 쓰레기는 아니었다. 이것들은 근미래에 사람들이 생각해낼 어떠한 효과라도 지원할 수 있는 유연성을 가졌다.

여기까지 픽셀 쉐이더를 주요하게 다루었지만 버텍스 쉐이더로 불리우는 또다른 종류의 쉐이더도 있다. 버텍스 쉐이더는 각 점마다의 연산을 수행한다. 이것들은 GPU 상에서 동작하는 작은 프로그램들이지만 각기 픽셀에서 보다는 각기 점에서 동작한다.점들을 주변으로 옮김으로써 3D 모델을 움직이게 하는 데에도 사용된다. 버텍스 쉐이더는 추잡한 동작을 만들기 위해 돌연변이의 손가락을 구부릴 수 있다. 그것들은 그의 얼굴을 찡그리게 할 수 있다. 그것들은 좀비가 떪에 따라 살점을 떨궈지게 만들 수 있다. 음....너무 환상속에 빠진 듯 하다. 그래, 버텍스 쉐이더는 깃발을 펄럭이게 하고 표정을 웃게 만들 수 있다. 버텍스 쉐이더는 또한 3D 장면에서 빛이 비추어질 때에도 향상된 연산을 할 수 있다. 하드웨어 TnL에서 완료되는 것은 모두 버텍스 쉐이더를 이용할 수 있다. DirectX 10과 같이 나오는 새로운 종류의 쉐이더로는 지오메트리 쉐이더가 있다. 이것은 한번에 많은 그룹의 점을 연산하는 것만 제외한다면 버텍스 쉐이더와 유사하다. 버텍스 쉐이더는 테이블의 한 버텍스만 작업이 가능하다. 지오메트리 쉐이더는 모든 테이블 상의 점에서 작업 가능하다. 사실 이것은 심지어 테이블을 생성하고 변형까지도 가능하다.

각각의 픽셀 쉐이더 프로그램은 픽셀 쉐이더 유닛에서 동작한다. 픽셀에 관해 하나 알아야 할 점은 : 이것들은 엄청나게 많다는 것이다. 이 것이 엄청나게 많은데, 사실, 모든 픽셀에 대해 픽셀 쉐이더 프로그램을 돌리기 위해서는 엄청난 양의 픽셀 쉐이더 유닛이 필요하다. 아니면, 화면 해상도를 낮추어 그릴 픽셀을 줄일 수도 있다. 그러나 누가 그런걸 원하나? 간단한 프로그램에서의 이미지 내의 모든 픽셀을 처리하는 것도 엄청난 양의 연산력을 요구한다. 화면상의 픽셀만큼 점들은 보통 그렇게 만지 않지만 여전히 이것들도 상당수 양이다. 그리고 보통 점을 처리하는 쉐이더의 연산 종류는 픽셀 하나를 처리하는 연산보다 많은 연산을 하게 된다. 그러므로 픽셀/버텍스 쉐이더들은 빠른 동작을 위해 더 많은 하드웨어를 요구하게 된다. 새롭게 나오는 비디오 카드마다 픽셀과 버텍스 쉐이더 유닛 갯수를 늘리는 이유가 여기있다.

DirectX는 쉐이더의 다양한 버젼을 구분하려 넘버링 시스템을 가지고 있다. 쉐이더들은 시간이 지날수록 추가적인 기능을 가져서 이들은 그들이 할 수 있는 것이 무엇인지 규정하려 버젼의 숫자를 필요로 하게 된다. 비디오 카드 사양을 볼 때 쉐이더 모델 2.0 을 뜻하는 "SM 2.0" 이 게시된 것을 볼 수 있다. 더욱이 픽셀 쉐이더 2.0과 버텍스 쉐이더 2.0을 뜻하는 PS 2.0 VS 2.0도 보게 된다. 이것은 2개의 분리된 숫자로 되어 있는데 몇몇 비디오 카드들은 픽셀 쉐이더와 버텍스 쉐이더의 버젼 숫자가 다른 숫자이기 때문이다. 다양한 DirectX 쉐이더 모델 넘버는 이 페이지에 게시되어 있다.

http://www.playtool.com/pages/vidtable/table.html#tableadvanced

DirectX 8

4.jpg
 
DirectX 8은 2000년도에 소개되었다. 이것은 프로그램 가능한 버텍스와 픽셀 쉐이더를 지원하는 DirectX의 첫번째 버젼이었다. 그래픽 관련 종사자들에게, 쉐이더의 소개는 아주 괜찮은 것이었다. 그러나 DirectX 8의 도입으로도 몇몇 제한이 따르게 되었다. 첫번째, 쉐이더 프로그램은 아주 짧아야 했다. 두번째, DirectX 8에서 쓰인 픽셀들은 아주 정확한 색으로 유지되기에 충분한 정보를 저장하지 못했다. 픽셀 쉐이더 연산이 아주 복잡하다면, 결과적으로 나오는 색은 매우 부정확했다. 연산의 각기 단계는 색으로 하여금 덜 정확하게 하는 결과를 내게 되었다. 긴 픽셀 연산은 아주 가시적인 오류를 냈다. Direct X 8 픽셀 쉐이더는 또한 픽셀마다 연산량이 다름에 따라 제한도 걸렸다. DIrect X 8 쉐이더들은 이전 버젼의 DirectX 들이 제공했던 그 어느것보다 훨씬 유연했지만, 여전히 프로그래머들이 하기를 원하던 것들에 대한 제약이 남겨져 있었다. 몇몇 향상된 효과에 대한 작업이 DirectX 8 픽셀 쉐이더에서 작동 하였지만 다른것들은 가능하지 않았다. 빛나게 그리는것, 움직이는 카멜레온은 아주 괜찮았다. (돌연변이 보다는 훨씬 생명체 같지만, 그게 끝이다.) 그러나 DirectX 8 픽셀 쉐이더는 여전히 원하는 것을 그들에게서 뽑아내기에는 역부족이었다.

2006년 말 현재, 여전히 Direct X 8 비디오 카드가 시장에 있다. DirectX 8의 픽셀 쉐이더 수행에 대한 제한 때문에 이들 카드를 구매하지 않는 것이 최상이다. 완벽하게 유연한 쉐이더는 DirectX 9까지 나오지 않아 많은 프로그램들은 DirectX 8쉐이더 지원을 위하여 제한적인 지원만을 하였다.

DirectX 9

5.jpg

DIrectX 9는 2002년 말에 등장하였다. 이것은 DirectX 8에서의 심각한 제약 대부분을 제거해버렸다. Direct X 9는 고정밀도 픽셀 색을 소개하였는데, 이것은 픽셀 쉐이더로 하여금 최종 색의 정확성을 해하지 않으면서 긴 급수의 연산을 할 수 있게 하였다. 픽셀 쉐이더들은 또한 픽셀 당 기반에서 수행하는 연산 종류를 바꿀 수 있는 수용력도 있다. 같은 픽셀 쉐이더도 다른 픽셀이나 어떠한 것 기반에서든 연산의 종류가 바뀌는 것에 의해 다른 것을 수행할 수 있다. DirectX 9는 장면에 픽셀 쉐이더가 나오게 했다. Direct X 9에서의 픽셀과 버텍스 쉐이더는 첫번째 범용 쉐이더 도입으로 고려된다. Direct X 9 카드 중 세간의 집중을 받은 카드는 Radeon 9700 Por였다. 이것은 Geforce 256과 같았다. : 이런 카드들은 새로운 세대의 등장을 예고하곤 했다.

더욱 진보된 종류의 쉐이더는 그래픽과 연관이 없는 연산에 대하여 실질적으로 충분한 유연성을 가지게 되었다. 많은 컴퓨터 소유자들은 그들의 스페어 CPU 사이클을 많은 종류의 분배된 컴퓨팅 프로젝트에 할당하곤 한다. 이들은 아주 큰 프라임 숫자를 찾는 프로젝트나, 외계 지적 생명체의 표식을 찾거나, 단백질 구조 연산에 분배하기도 한다. 이들 프로젝트는 엄청난 양의 컴퓨팅 능력을 필요로 하므로 십시일반으로 모아 그들이 사용하지 않을 때 수백만 사람들의 가정 컴퓨터에서 구동하여 큰 부하량을 이루게 된다. 이런 모든 가정 컴퓨터는 1개 문제에 대해 가장 강력한 슈퍼컴퓨터보다 훨씬 더 빠르게 작업 하려고 공동 작업을 하게 된다. 여기에도 쉐이더가 들어가게 된다. 가장 최근의 쉐이더 도입은 (보통 Direct X 9 이상) CPU 대신 비디오 카드의 GPU를 이용하여 같은 종류의 연산을 하게 하는 것이다. 그리고 알맞은 비디오 카드는 CPU보다 몇배 더 빠른 쉐이더를 이용할 수 있다.

DirectX 10

Direct X 10은 2007년 초에 소개되었다. Direct X 10은 지오메트리 쉐이더를 소개하였다. 이것들은 점들의 그룹을 생성하거나 작업하는 능력이 있다. 이전 버젼의 Direct X 는 물체를 그리고 다른 물체를 그릴 때 엄청난 양의 일을 CPU에서 하기를 요구하였다. 이것은 한번에 화면에 내놓을 수 있는 각기 다른 물체들의 수를 제한하게 된다. Direct X 10은 확실히 이런 전환 과정에서 CPU 오버헤드를 줄였다. 가장 가시적인 결과는 화면에 다양한 종류의 물체들을 엄청난 수로 놓을 수 있게 된 것이다. 이렇게 하여 각기 다르게 보이는 나무를 많이 놓을 수 있고, 진짜 풀잎을 땅에서 표현하거나, 우리가 보아왔던 확실히 텅텅 빈 3D 방과는 대조적으로 엄청난 양의 물체를 채워 넣을 수 있게 된다. 또는 돌연변이 주변을 감싸고 있는 방사성 조각을 훨씬 더 많이 표시할 수도 있따. 이것은 훨씬 더 현실적인 세계를 표현할 수 있게 된다.

동시에 DirectX 10에서 나타난 또다른 것은 통합 쉐이더 설계이다. 이 새로운 설계를 GPU에서 사용하기를 요구하는 DirectX 10으로써는 그렇게 새로울 것이 없지만, ATi와 Nvidia는 이것을 사용하여 대부분의 빠른 DirectX 10 비디오 카드를 팔았다. 내장 비디오가 설계된 메인보드들은 아마 당분간은 이 새로운 설계를 사용하지 않을 것이다. 안좋은 소식이긴 하지만 아주 좋은 선택이다.

먼저 통합되지 않은 쉐이더 설계에 대해 말해보자. 재래식 비디오 카드는 24개의 픽셀 쉐이더 유닛과 8개의 버텍스 쉐이더 유닛을 가지고 있다. GPU 실리콘 칩에서 큰 부분을 차지하는 것은 분리된 24개의 픽셀 쉐이더 유닛이다. 또다른 칩의 부분은 버텍스 쉐이더 유닛이 사용하고 있다. 칩의 픽셀 쉐이더 부분은 픽셀 연산만 할 수 있으며 칩의 버텍스 쉐이더 부분은 점 연산만 가능하다. 많은 픽셀 쉐이더 연산이 필요한 프로그램을 실행시키면 아주 적은 수의 버텍스 쉐이더 연산만 하기에, 칩의 픽셀쉐이더 부분은 전속력으로 동작하지만 칩의 버텍스 쉐이더 부분은 대부분의 시간을 아무것도 하지 않는다. 동일하게, 버텍스 쉐이더에 대한 엄청난 연산을 필요로 하면서 픽셀 쉐이더 작업을 거의 하지 않는다면 픽셀 쉐이더 유닛들이 대부분 일을 하지 않게 될 때가 생길 것이다. 이것은 아주 비생산적이다. 그리고 이것이 좀 더 심각해지는 이유는 많은 3D 프로그램은 보여지는 것에 따라 화면 상의 점들의 수가 넓은 폭의 변화를 가진다는 것이다. 가끔 지형은 아주 복잡하며 어떤 때는 단순하다. 언제나 항상 전속력으로 동작하는 픽셀 쉐이더 하드웨어와 버텍스 쉐이더 하드웨어의 비율을 꼭 찝을 수 있는 방법은 없다.

통합 쉐이더 하드웨어는 이 문제에 대한 해결책으로 나왔다. 픽셀 쉐이더들은 색 요소의 연산을 위해 대부분 곱셈과 덧셈을 하기 위하여 만들어진 간단한 수학 프로그램의 모음으로 동작한다. 버텍스 쉐이더들 또한 특별히 점들을 곱하고 더하기 위해 만들어진 간단한 수학 프로그램들의 모음으로 동작한다. DirectX 8로 돌아가보면, 점들은 아주 정확한 값으로 표기됐지만 색 요소(픽셀을 구성하는 빨강, 초록, 그리고 파란 부분) 는 아주 적은 정확도로 표시됐었다. 그러므로 픽셀 쉐이더는 적은 값을 곱하고 더할 수 있었는 데 반해 버텍스 쉐이더는 훨씬 더 큰 값으로 작업할 수 있었다. 이 두가지 종류의 연산 하드웨어는 공통점이 거의 없었다. 그러나 이 세대의 비디오 카드 는 대부분의 색 요소들이 점과 같이 높은 정확도로 표시된다. 이것들은 같은 크기의 값으로 작동된다. 대부분의 경우 이것은 32비트 부동소수점이다.

이 통합 아키텍쳐는 1개의 큰 그룹으로 이루어진 연산 유닛으로 이루어져 있다. 이들 유닛 내의  하드웨어 대부분은 이들 고정밀도 값과 함께 분리되어 작업하게 된다. 그러나 이것들은 픽셀쉐이더, 버텍스 쉐이더, 그리고 새로운 지오메트리 쉐이더로 이용될 수 있다. 이것들은 딱 집어 한가지 용도로 사용되는 쉐이더가 아니다. 프로그램의 부하가 90% 픽셀 연산이고 10% 버텍스 연산이라면 이 비율에 맞추어서 모든 통합 연산 유닛이 사용중이 될 것이다. 10%의 픽셀과 90%의 점 연산이 나온다면 그들은 이 비율에 맞출 것이며 그들은 여전히 모두 사용중이 될 것이다. 당신 GPU의 대부분은 이제 노는것 없이 열심히 일할 것이다. 쉐이더 세계는 마침내 균형을 잡게 되었다. 이것은 아주 바람직한 것이다.


http://www.playtool.com/pages/basic3d/basics.html

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