Version 1

DirectX 8에서 최초로 정의되었으며, NVidia의 지포스 3(NV20)가 최초로 지원했다.

버전 1의 셰이더 명령어들은 선형 계산 정도만 수행 할 수 있고(혹은 낮은 정확도의 비선형 계산), 프로그램의 분기를 전혀 지원하지 못하며, 수행가능한 프로그램의 길이가 매우 짧다. 때문에 하나의 셰이더가 복잡한 스키닝과 다양한 재질효과 등을 동시에 구현할 수 없다.

버전 1의 픽셀 셰이더는 엄밀하게 말하자면 프로그램이라기 보다는 state switching에 가깝다. 보통 8개의 텍스쳐 단계에 대해서 색깔 콤포넌트별로 8bit의 단순한 연산 방식만을 정의할 수 있다. 따라서 연산 정확도는 8bit(256단계) 밖에 안되고 [-1, 1]의 범위를 넘어서는 연산을 할수 없다. 때문에 버전 1에서의 픽셀 셰이더 프로그램들은 복잡한 연산을 흉내내기 위해서 별도의 텍스쳐를 연산 테이블로 사용하기도 한다. 예를 들어 픽셀 단위로 정확한 specular 효과1 를 내기 위해서는 픽셀 셰이더에서 거듭제곱(power)을 계산해야 하는데, 픽셀 셰이더 버전 1에서는 이것이 불가능기 때문에 텍스쳐에 미리 테이블로 저장해서 사용한다. (당연히 정확도는 떨어진다)

또한 버텍스 셰이더에서 픽셀 셰이더로 부가적인 결과값을 전달하는 방법이 대체로 텍스쳐 좌표 레지스터2 를 이용한 방식뿐이기 때문에 픽셀 셰이더가 버텍스 셰이더로부터 전달 받을 수 있는 값이 매우 제한적이다. 특히 XBOX에 장착되어 있는 NV2A GPU는 텍스쳐 좌표 레지스터가 4개뿐이기 때문에 범프 맵을 구현하는 픽셀 셰이더를 작성하면 그 이외에 추가적인 기능을 넣는것이 매우 어렵다.

1. Specular 효과 : 물체의 표면에서 광원과 시점 사이의 반사각에 의해 밝은 하이라이트가 나타나는 현상
2. 레지스터 : 프로세서 내에서 계산값을 임시로 저장하는 장소

Version 2

셰이더 버전 2가 소개되면서 버전 1의 문제가 되었던 부분들이 크게 개선되었다.

가장 큰 변화는 제한적이지만 프로그램 분기가 가능해진 점이다. 버전 1 셰이더에서는 외부 조건에 의해서, 혹은 프로그램 수행 결과에 따라서 다른 처리를 하는 것이 불가능했지만 셰이더 2의 프로그램 분기를 이용하면 하나의 셰이더 프로그램이 상황에 따라서 다양한 처리를 할 수 있다. 하지만 아직은 프로그램 분기 기능이 제약적이기 때문에 복잡한 구조로 돌아가는 셰이더를 작성하는 것에는 무리가 있다.

또한 버전 2의 셰이더에는 삼각함수, 거듭제곱, 로그함수 등을 높은 정확도로 계산할 수 있는 명령어들이 추가되어 더욱 복잡도 높은 계산을 할 수 있게 되었다.

버전 2의 픽셀 셰이더는 버전 1의 그것과 전혀 다른 모습으로서 버전 1의 단점들을 대부분 해결하였다. 버텍스 셰이더의 ALU(Arithmetic Logic Unit)1와 비슷한 연산력을 갖게 되었기 때문에 제대로된 벡터 연산을 할 수 있게 되었고, 텍스쳐 접근 방식도 직관적으로 바뀌었다. 이제는 계산을 시뮬레이션 하기 위해서 텍스쳐를 숫자 테이블로 쓸 이유가 없어진 것이다. 게다가 픽셀이 그려지는 위치의 배경 픽셀이나 인접한 픽셀에 접근할 수 있기 때문에 안티 알리아싱2 과 같은 다양한 용도로도 사용할 수 있다.

픽셀 셰이더 2는 계산의 내부 정확도가 충분히 높아졌기 때문에(128bit 벡터) 픽셀 셰이더의 결과값을 저장하기 위한 부동 소숫점3 텍스쳐 포맷이 등장하였다. 이를 응용하면 GPU 상에서 텍스쳐를 통한 유체 시뮬레이션을 표현할수도 있다. CPU가 이러한 계산을 하는 것은 매우 부하가 많이 걸리는 작업이지만 셰이더 2를 사용하는 GPU에서는 프로그램의 전체 성능에 큰 영향을 주지 않는 범위내에서 실행 가능하다. 예를 들면 캐랙터가 물에서 수영할 때 단순한 패턴으로써 물의 요동을 표현하는 것이 아니라, 픽셀 단위로 시뮬레이션 된 매우 사실적인 물의 움직임도 표현할 수 있다.

또한 픽셀 셰이더가 최종 깊이 버퍼(z/w-buffer) 값을 조작할 수 있기 때문에 깊이 버퍼를 이용한 다양한 트릭을 사용할 수 있다.

1. ALU : 프로세서 내의 여러 부분 중에서도 산술적 계산이 이루어지는 부분을 말함
2. 안티 알리아싱(Anti Aliasing) : 렌더링 된 물체 외곽선의 계단현상을 제거하여 부드럽게 보여주는 기법
3. 부동 소숫점 : 컴퓨터 상에서 실수(real number)를 표현하는 기법중의 하나

Version 3

셰이더 버전 3으로 발전하면서는 버전 1과 2사이의 차이만큼 큰 변화는 없다. 약간의 명령어 추가가 이루어졌고 셰이더 프로그램 분기 능력이 향상되었으며 더 큰 크기의 셰이더 프로그램을 작성할 수 있다.

버텍스 셰이더 버전 3에서 주목할 것은 텍스쳐 데이터를 사용할 수 있다는 것이다. 본래 GPU의 버텍스 처리 단계는 순수하게 3D 버텍스 데이터만을 처리하기 때문에 여기에 텍스쳐가 관여되는 것은 여지껏 GPU의 입장에서는 불가능한 일이었다. 버텍스 처리 단계에서 텍스쳐를 사용 가능하다는 것은 하드웨어적인 displacement map1 이나 다른 셰이더의 렌더링 결과를 3D 메쉬 처리에 사용할 수 있다는 의미를 갖는다.

셰이더 버전 1부터 문제의 소지가 많았던 버텍스 셰이더에서 픽셀 셰이더로의 결과 전달 방법이 셰이더 3로 오면서 약간의 변화가 생겼다. 셰이더 2까지는 버텍스 셰이더에서 픽셀 셰이더로 전달해야 하는 결과값의 종류가 미리 정의되어 있었으나 셰이더 3에서는 프로그래머 마음대로 정의할 수 있기 때문에 버텍스 셰이더로부터 더욱 많은 정보를 픽셀 셰이더로 전달할 수 있다.

아쉽게도 셰이더 3를 지원하는 하드웨어는 아직 출시된것이 없지만, 그 구체적인 스펙으로 추측하건데 셰이더 3를 지원할 GPU의 설계는 꽤 전부터 완성이 되어있었기 때문에 마이크로소프트와의 협력하에 셰이더 3 표준이 만들어진 것으로 보인다.

ATI와 NVidia의 신형 GPU들의 데뷔가 눈앞에 와 있으니 기대해 보도록 하자.

1. Displacement Mapping : 평면적인 물체에 텍스쳐를 이용하여 굴곡을 표현하는 기법

저자 : 김성균 ( 게임 프로그래머 )
728x90

+ Recent posts