구글 태그

2006년 3월 9일 목요일

Shader

다음 글은 월간 게이머즈 2005년 8월호에 실렸던 내용입니다..

우연찮게 게이머즈의 기술관련 컬럼에 외부 필자가 필요하다고 해서 하게 되었는데요.. 이전부터 잡지사의 원고료가 짜다는 말은 많이 들었지만, 실제로 겪어보니 정말 짜더군요;; 페이지 수로 따지니까 그런것도 있겠지만, 이런 류의 원고는 원고 작성에 필요한 참고서적 값도 안 나올듯 합니다.. 어찌됐든 기술에 문외한 일반인을 대상으로 한 컬럼이니 감안하시고, 제가 썼던 초고가 아니라 잡지사 기자분이 약간 다듬어 주신 내용이니까 읽기에 편할겁니다.. 라곤 하지만 단 2회 쓰고 잘린걸 보면 이 내용도 일반인 대상으로는 좀 어려웠을지도 모르겠네요.. ^^;;

미래시대 (월간 게이머즈 2005년 8월호 수록 내용)
글 / 토끼털 두른 셋쇼마루님 (마감날짜에 쫓겨 급조한 필자명입니다.. ㅠ_ㅠ)

Shader
[셰이더]
기존의 경직된 3차원 그래픽 파이프라인(주 1)에 유연성을 주기 위하여 만들어진, 그래픽 파이프라인 상의 프로그래밍 가능한 구성요소를 통칭한다.

3차원 그래픽 파이프라인
PC용으로 등장하는 최신 게임을 즐기려 할 때면 어김없이 등장하여 게이머의 머릿속을 어지럽히는 단어가 있으니, 그 이름 ‘셰이더’. 오늘은 이 셰이더의 정체를 파헤쳐보고, 앞으로의 발전 방향도 짚어보도록 하자.

앞서 정의한 내용에 따르면, 셰이더란 ‘기존의 경직된 3차원 그래픽 파이프라인’에 ‘유연성’을 주기 위해 만든 것이라고 했다. 그렇다면 기존의 경직된 3차원 그래픽 파이프라인이 무엇인지, 왜 경직되었다고 말하는지를 알아야 이야기를 풀어갈 수 있을 것이다.

우선, 일반적으로 3차원 그래픽 가속 하드웨어(즉 3D 그래픽 카드)에서 3차원 그래픽을 어떻게 지원하는지 살펴보자. 이 글에서는 우리가 흔히 접하는 DirectX를 기준으로 설명하도록 하겠다. 다음은 마이크로소프트에서 제공하는 DirectX 개발도구에서 발췌한 Direct3D의 그래픽 파이프라인의 개략도이다.

그림 1 - Direct3D의 그래픽 파이프라인

뭔가 알 수 없는 단어들이 잔뜩 나오는데, 우리가 이걸로 당장 3차원 게임을 개발할 것도 아니니 자세히 알 필요는 없다. 대강 이게 뭘 하는 것인가만 살펴보자.

맨 처음에 정점(vertex) 데이터와 원시(primitive) 데이터가 들어간다. 여기서 들어가는 정점 데이터와 원시 데이터가 바로 우리들이 소위 말하는 폴리곤이다. 3차원 화면 안에 들어갈 폴리곤 덩어리가 데이터로 입력되는 것이다.

그림 2 - 폴리곤은 이와 같이 점과 선으로만 구성되어 있다

테셀레이션(tessellation)이란 ‘공간분할’이라고도 하는데, 필요에 따라 다각형의 폴리곤을 삼각형으로 쪼개는 등의 작업을 한다. 이건 우리의 관심사 밖이니 그냥 넘어가도록 하겠다.

그 다음 작업은 정점 처리(vertex processing)이다. 이것은 정점의 좌표를 필요에 따라 변환하고 정점 단위의 재질 속성을 준 다음, 정점 단위의 안개를 주고 정점 단위의 광원을 처리하는 작업이다. 여기서 재질 속성과 안개와 광원은 DirectX에서 미리 지정한 몇 가지 방식을 결합하여 사용한다.

정점 처리가 끝난 폴리곤은 기하 처리를 거치게 된다. 기하 처리란 폴리곤 데이터를 화면에 표시할 수 있는 데이터로 바꾸고, 화면에 그릴 필요가 없는 부분을 빼는 등의 작업을 말한다.

이 다음에 등장하는 픽셀 처리에 앞서 텍스처 평면이 입력되는데, 화면에 입체감 입게 보이는 텍스처도 실제로는 평면이기 때문에 ‘텍스처 평면’이라고 부른다. 텍스처 샘플러는 이 텍스처를 읽어 들여 적당한 해상도로 변환하는 역할을 한다.


그림 3 - 폴리곤에 입히는 텍스처는 이와 같이 평면 이미지이다

그 다음 단계는 픽셀(주 2) 처리로서, 폴리곤과 텍스처를 결합하여 화면에 찍을 점 하나하나를 생성하는 단계라고 할 수 있다. 여기서 폴리곤과 텍스처를 결합하는 방식은 DirectX에서 미리 지정한 몇 가지 방식을 혼합하여 사용한다.

마지막에는 화면에 대한 후처리를 거쳐 생성된 그림을 화면에 뿌려주는 픽셀 렌더링을 수행하게 된다. 이 단계에서는 투명도, 깊이, 안개 등을 처리하여 최종적으로 그림을 생성하고 이를 화면에 뿌려준다.

그림 4 - 셰이더를 적용하지 않고 기존의 그래픽 파이프라인을 거쳐서 폴리곤과 텍스쳐를 결합하면 이와 같이 단정한(?) 결과를 얻을 수 있다

왜 셰이더인가
이와 같이, 기존 방식대로의 고정 그래픽 파이프라인을 사용하게 되면 결과적으로 모든 게임이 비슷비슷한 화면을 보여줄 수밖에 없게 된다. GPU의 성능이 발전함에 따라 한 화면에 그려줄 수 있는 폴리곤의 수와 텍스처의 양은 늘어만 가는데, 이러한 게임들이 화면에 보여주는 물체의 재질이나 광원은 모두 비슷비슷한 탓에 모든 게임이 비슷한 외형을 지니게 되자, 이는 표현상의 한계로 작용하게 된다. 따라서 개발자들이 고정 그래픽 파이프라인의 일부를 개발자가 만든 프로그램으로 대체할 수 있는 기능을 요구하게 되었는데, 이것이 구현된 형태가 바로 셰이더이다(주 3).

DirectX에서는 프로그래밍 가능한 정점 셰이더(programmable vertex shader)와 프로그래밍 가능한 픽셀 셰이더(programmable pixel shader)가 3차원 그래픽 파이프라인에서 개발자가 직접 개발한 코드로 대체할 수 있는 부분이 된다.

여기서 다시 3차원 그래픽 파이프라인으로 돌아가 보자. 파이프라인에 셰이더가 적용되면, 다음 그림과 같이 정점 셰이더와 픽셀 셰이더가 기존의 정점 처리와 픽셀 처리를 대신하게 된다. 실제로는 픽셀 처리 작업의 경우 2단계로 이루어져 있고, 픽셀 셰이더는 그 중에 1단계 부분만을 대체한다.

그림 5 - 셰이더가 적용된 3차원 그래픽 파이프라인

앞에서 정점 셰이더는 ‘정점의 좌표를 필요에 따라 변환하고, 정점 단위의 재질 속성을 주고, 정점 단위의 안개를 준 후, 정점 단위의 광원을 처리한다’고 말한 바 있다. 이 내용을 떠올려보면, 이 부분을 개발자가 만든 고유한 프로그램으로 대치했을 때 어떤 효과가 얻어질지 미루어 짐작할 수 있을 것이다.

예를 들면, 폴리곤으로 만들어진 사람의 모델에서 정점의 좌표를 변환하는 부분을 고쳐 관절의 꺾이는 부분을 부드럽게 해준다든가(정점 스키닝), 재질과 광원을 설정하는 부분을 고쳐 특별한 재질과 광원을 만들어 독특한 질감을 나타내는 등의 표현이 가능해지는 것이다.

고정 그래픽 파이프라인의 픽셀 처리 단계에서는 폴리곤과 텍스처를 그래픽 하드웨어가 제공하는 몇 가지 방식으로 결합하여 화면에 찍을 픽셀의 색상을 결정하게 된다. 이 단계에서 고유한 기능을 프로그램으로 구현하면, 폴리곤에 텍스처를 입히는 과정에서 그래픽 하드웨어가 제공하는 방식을 벗어난 독자적인 표현 방식을 표현해낼 수 있다. 예를 들어 평면 텍스처를 입혔는데도 텍스처가 울퉁불퉁해 보이도록 만든다던가(흔히 말하는 범프 매핑 등), 배경 이미지를 텍스처에 섞어 반사 효과를 준다던가(픽셀별 환경 매핑) 하는 기능들이 모두 픽셀 셰이더를 이용하여 구현되는 것이다.

그림 6 - 셰이더를 이용하여 엣지 글로우(edge glow) 효과를 적용한 예

그럼 왜 하필 다른 부분이 아닌 정점 처리와 픽셀 처리에만 셰이더를 적용하는 것일까? 이유는 간단하다. 다른 부분은 작업 자체가 정형화되어 있기 때문에, 프로그래머가 고유한 기능을 구현할 필요가 그다지 많지 않기 때문이다. 정점 처리와 픽셀 처리 부분을 고유한 프로그래밍으로 구현하면 화면에 나타나는 결과가 크게 달라지지만, 다른 부분에서는 그 효과가 미미하기 때문에 큰 의미가 없는 것이다.

현재의 셰이더는 용량상의 제약이 있고 명령어의 기능도 미약해서 구현하기 여간 까다롭지 않다. 하지만, PS3나 Xbox 360 등 차세대 게임기의 스펙에 의하면 화면 전체를 다양한 효과로 메우고도 남을 정도로 강력한 성능의 셰이더를 지원하고 있다. 현재의 게임에서 추구하는 그래픽은 실사와 같은 그래픽과 애니메이션풍의 그래픽, 이 두 가지 방향으로 나뉜다고 할 수 있다. 앞으로는 발전된 그래픽 하드웨어의 능력에 힘입어 이러한 두 방향의 그래픽이 더욱 향상됨은 물론이고, 우리가 예상하지 못했던 새로운 표현 기법들이 생겨날 것이다. PS3나 Xbox 360과 같은 앞으로의 하드웨어에서는, (실제 게임에 활용될지는 미지수이지만) 유화나 수채화 같은 그래픽의 실시간 구동도 가능한 수준에 이르렀다. 셰이더를 통해 앞으로 게임의 그래픽 표현이 어느 정도까지 발전할지를 지켜보는 것도 흥미로운 일이 될 것이다(주 4).

(주 1) 3차원 그래픽 가속 하드웨어에서 데이터를 처리하는 흐름을 나타내는 그림이 마치 수도관의 모습과 비슷하다 하여 붙여진 명칭.

(주 2) pixel. 화면을 구성하는 하나하나의 점을 의미하는 단어로, ‘화면 구성요소(picture element)’의 약자이다. 화소(畵素)라고도 한다.

(주 3) 최초로 셰이더를 탑재한 DirectX는 2000년 11월에 발표된 버전 8.0이지만, 그보다 훨씬 이전인 1999년 3월 출시된 SCE의 PS2에는 이미 CPU인 이모션 엔진 내에서 마이크로 코드(micro code) 프로그래밍을 통해 셰이더와 동일한 개념을 하드웨어적으로 지원하고 있었다. 이는 PS2가 당시로서는 개념적으로 한 세대 앞선 획기적인 하드웨어였음을 입증하는 대목이다.

(주 4) 스펙 상으로 보아, PS3에 포함되는 GPU인 RSX(Reality Synthesizer)는 엔비디아의 차세대 GPU인 G70을 90nm 공정으로 생산하고 성능을 향상시킨 제품으로 추정된다. 이는 PS2 당시 이모션 엔진을 통해 PC용 그래픽 하드웨어보다 한발 앞서 셰이더 개념을 도입했던 것과는 달리, PS3의 경우 적어도 그래픽 분야에서는 새로운 개념보다는 PC와 동시대의 GPU를 사용하는 식의 타협을 택했음을 의미하기도 한다. PS3와 Xbox 360의 GPU 성능은, 하드웨어 구조가 달라 정확히 비교할 수 없겠지만 성능상의 차이가 크지는 않다는 것이 일반적인 견해이므로, 차세대기들이 출시되는 시점에서는 이미 최신의 고급 그래픽 카드를 사용하는 PC와 그래픽으로 큰 격차가 나지 않는 상황이 될 것으로 보인다. 차세대기에서는 순수하게 게임 그 자체로 승부해야 하는 상황이 오게 된다는 뜻일지도……

댓글 없음:

댓글 쓰기