Keyword: 쉐이더

프로그래밍이 가능한 버텍스 쉐이더와 함께 DirectX 8은 픽셀 쉐이더 역시 사용이 가능하다.

픽셀 쉐이더란 무엇인가? 컴퓨터 그래픽의 최종 결과는 이미지를 표현하는 것임을 상기해보자. 이러한 이미지는 다수의 픽셀들로 구성되어 있으며, 그 각각의 픽셀은 색상을 가져야만 한다. 변형, 광원효과 및 오브젝트의 텍스쳐 매핑 등의 모든 연산의 결과는 최종적으로 컴퓨터 스크린에 표시될 때 사람의 눈에 제대로 보일 수 있는 픽셀의 무리를 만들어내는 것이다. 픽셀 쉐이더는 폴리곤에 적용된 텍스쳐 안에서의 위치, 즉 텍스쳐 좌표 정보로부터 색상을 만들어낸다. 이렇게 만들어진 색상은 기본적인 색상정보만을 가지고 있는것이 아니라 투명도나 블렌딩에 대한 정보도 가지고 있다. 마지막으로 출력되는 색상은 화면에 최종적으로 나타나는 픽셀의 색상이다.

DirectX 8의 프로그래밍이 가능한 픽셀 쉐이더와 GeForce3 GPU는 프로그래머가 모든 픽셀 수준의 특수효과를 더욱 뛰어난 성능으로 수행하는 고정된 파이프라인을 구현하게 해 준다. 하지만 더 중요한 것은 프로그래머는 이제 사실상 무한한 수의 특화된 광원효과 및 텍스쳐 효과를 그들의 어플리케이션을 위해서 사용할 수 있다는 것이다. 프로그래밍이 가능하다는 점은 개발자들에게 쉐이딩을 위한 그들 자신만의 방법을 창조할 수 있는 엄청난 유연성을 부여한다. 개발자들이 만들어낼 수 있는 새로운 특수효과들은 보다 현실적으로 느끼고, 볼 수 있는 질감을 가지게 될 것이다.

아래에서 이러한 능력의 몇가지 사례를 살펴볼 것이다.

반사광을 가지는 범프 매핑

bump.jpg

프로그래밍이 가능한 픽셀 쉐이더를 사용하여 반사광을 가지는 범프 맵이 적용되었다. 어떠한 각도에서도 왜곡이 없고 올바르게 보인다.


반사광을 가지는 범프 매핑(픽셀 수준의 반사광)에 사용될 지오메트리 셋업을 위해서 어떻게 개발자들이 버텍스쉐이터를 사용하는가를 앞 페이지에서 다룬 바 있다. 이러한 효과를 만들어내기 위한 한가지 방법은 DirectX 6에서 처음 등장한 인바이어런먼트 범프 매핑(environment bump mapping : EMBM)이다. 하지만 EMBM은 여러가지 광원의 방향에 대해서는 제대로 동작하지 못했으며, 많은 제한점을 안고 있었다. 현재는 반사광을 가지는 범프 매핑을 표현하기 위한 몇 가지 방법이 존재한다. DirectX 7에서 레지스터 컴바이너(register combiner)와 dot3 범프 매핑이 구현되었다. 도트 프로덕트 범프 매핑은 광원의 방향에 관게없이 올바른 화면을 만들어준다. 하지만 이 때의 dot3의 셋업은 CPU가 담당했으며, 그래서 성능상의 문제가 발생했고, 광범위한 사용은 제한되었다. NVIDIA의 GeForce3은 DirectX 8을 완벽하기 지원함으로써, dot3 범프 매핑의 셋업을 GPU 내에서 완전하게 수행해낸다. 이것은 금속 질감을 가지는 범프 매핑 효과를 놀라운 성능으로 구현해낸다.

독립된 텍스쳐

독립된 텍스쳐를 읽어들이는 기능은 DirectX 6에서부터 적용되었지만 그 때는 단지 EMBM에만 해당되었다. DirectX 8의 픽셀 쉐이더 인터페이스는 독립된 텍스쳐를 읽어들일 수 있는 포괄적인 능력을 가진다. DirectX 8의 픽셀 쉐이더 인터페이스를 지원하는 하드웨어, 예를 들어서 GeForce3 등은 이제 EMBM 같은 독립된 텍스쳐를 요하는 작업을 수행할 수 있으며, 무지개 빛을 만들어내거나 홈이 파인 표면을 표현하는데에 쓰이는 이방형 광원효과 등의 다른 특수효과도 사용할 수 있다.



3D 가속 그래픽 카드가 하는 일은 3D 데이터를 2D인 모니터 화면에 그려주는 것이다. 초창기의 3D 하드웨어는 단색의 삼각형들(폴리곤)만을 그릴 수 있었으나 시간이 흘러 기술이 발전하면서 다면체 위에 텍스쳐를 입히고 다양한 라이팅 기법을 지원하면서 안개 등을 유사하게 표현할 수 있는 기능들이 추가되었다. 이러한 다양한 기능들이 하드웨어적인 방식으로 GPU1 내에 계속 추가되어 왔으나, 언제나 문제는 프로그래머가 표현할 수 있는 범위가 GPU내에 하드웨어적으로 고정된 표현 방식에 제약 될 수 밖에 없었다는 점이다. GPU 제조사들은 나름대로 다양한 표현 기법을 지원하기 위해서 많은 모듈들을 하드웨어적으로 계속 추가해왔지만, 그래픽 프로그래머들은 항상 GPU 기능의 유연성 부족으로 인해 곤란을 겪어야만 했다.

이러한 GPU의 유연성 문제를 극복하기 위해서 렌더링 방식을 소프트웨어적으로 프로그램 할 수 있게 하는 것이 셰이더(shader)이다.

예를 들어 셰이더를 지원하지 않는 GPU에서는 실시간 광원 계산 기법을 사용하기 위해서는 GPU에 정의된 point, spot, directional2 등의 방식중에서 하나를 선택해야 했다. 하지만 셰이더를 사용하면 프로그래머가 자신만의 새롭고 더욱 사실적인 광원 계산 방식을 GPU에 프로그램 하는 것이 가능하다. 프로그램 가능한 셰이더 기능과 구별하기 위하여 구형 GPU의 고정된 렌더링 방식을 fixed function pipeline 이라고 한다.

3D 프로그래머나 GPU 제조사들에게 있어서 궁극의 목표는 리얼타임 렌더링 환경하에서 프리 렌더링된 CG영상 정도의 표현력을 갖는 것이다. 리얼타임 환경에서 제약이 있는 이유는 대부분의 표현이 GPU 안에서 일어난다는 것인데, 구형의 GPU에서는 하드웨어적으로 구현되어 있는 기능만을 표현할 수 있는 것이 문제였다. 그러나 이제 프로그래머들은 셰이더를 통해서 자신이 원하는 계산 루틴을 GPU 안에 넣을 수 있게 됨으로인해 소프트웨어적인 복잡한 표현을 GPU가 빠르게 처리할 수 있게 되었다.


k22209p1n1-s.jpg

리얼타임 렌더링임을 눈치챌 수 있는가? – ATI의 데모 ‘Bacteria’


GPU가 3D 데이터를 화면에 그리기 위해서는 pipeline3 이라고 하는 일련의 단계를 통해서 데이터가 처리된다. 이러한 pipeline의 단계중에서 가장 중요한것이 vertex processing과 rasterization이다(PS2에서는 두 단계가 별개의 칩으로 분리되어 있기도 하다). 각각 3D 버텍스 처리, 2D 상의 화면 픽셀 처리라는 전혀 다른 역할을 하기 때문에 셰이더 프로그램도 두가지 종류가 존재하여, 버텍스 처리에 대한 프로그램을 버텍스 셰이더(vertex shader), 화면 픽셀 처리에 대한 프로그램을 픽셀 셰이더(pixel shader)라고 한다.

셰이더 프로그램은 GPU에 대한 명령의 집합이다. 그러나 셰이더는 버텍스와 픽셀 데이터만을 처리하기 위한 프로그램이므로 CPU에서 작동하는 일반적인 프로그램과 달리 입력과 출력 형식이 명확히 고정되어 있다.

사실 버텍스 셰이더, 픽셀 셰이더라는 명칭은 DirectX 상에서 쓰이는 용어이다. OpenGL4 에서는 각각 vertex program, fragment program 이라고 불린다. (이후 글에서는 편의상 모두 셰이더로 칭함)

k22209p1n2-s.jpg

최근에 공개된 NVidia의 데모 ‘Last Chance Gas’


버텍스 쉐이더란, 내부에 수많은 연산유닛을 탑재하고 있어 , 수행해야하는 버텍스의 종류에 따라 그만큼의 연산유닛을 할당함으로써 그래픽 처리 효율을 높이는 역할을 한다.


< 쉐이더 > 키워드와 관련된 포스트들

2012/01/30 WebRTC 데모 - 포토부스 스타일 라이브 비디오 이펙츠
2011/08/28 WebGL 쉐이더 데모 - 순회하는 물결들
2011/04/15 WebGL 레슨 2 - 색상 추가
2011/04/14 WebGL 레슨 1 - 삼각형과 사각형 (1)
2010/03/29 Canvas와 자바스크립트를 이용한 동적 광원효과 (3)