셰이더
1. 개요
셰이더는 3D 그래픽의 시각적 효과를 제어하는 데 사용되는 프로그램이다. 1988년 픽사의 렌더맨 인터페이스 발표와 함께 처음 소개되었으며, GPU의 발전과 함께 프로그래밍 가능한 셰이더가 등장했다. 셰이더는 버텍스 셰이더, 지오메트리 셰이더, 픽셀 셰이더, 테셀레이션 셰이더, 컴퓨트 셰이더 등 다양한 종류가 있으며, OpenGL, Direct3D와 같은 그래픽 라이브러리에서 지원된다. 셰이더는 셰이딩 언어로 프로그래밍되며, 병렬 처리에 적합하여 그래픽 처리량을 향상시킨다. 영화, 게임, 2D CG 소프트웨어 등 다양한 분야에서 활용되며, 특히 대한민국에서는 게임 산업의 발전에 크게 기여했다.
-
셰이딩 -
난반사
난반사는 재료 표면 아래에서 빛이 산란되어 모든 방향으로 퍼져 나가는 현상으로, 재료 내부 구조에 의한 반복적인 반사 및 산란 때문에 발생하며 시각적 인식과 컴퓨터 그래픽스 등 다양한 분야에서 활용되고 특정 모델로 근사할 수 있다. -
셰이딩 -
광선 추적
광선 추적은 빛의 경로를 시뮬레이션하여 3차원 컴퓨터 그래픽 이미지를 생성하는 렌더링 기법으로, 재귀적 광선 추적 개발과 하드웨어 가속 지원에도 불구하고 높은 계산 비용이 실시간 처리의 제약으로 남아있다. -
3차원 컴퓨터 그래픽스 -
픽셀 셰이더
픽셀 셰이더는 렌더링 과정에서 픽셀의 색상을 계산하여 최종 모습을 결정하며, 텍스처, 빛, 그림자 등의 시각 효과를 구현하고, 다양한 언어로 프로그래밍되며, 그래픽 카드 및 칩셋은 지원하는 버전을 가진다. -
3차원 컴퓨터 그래픽스 -
모션 캡처
모션 캡처는 물체의 움직임을 디지털 데이터로 변환하는 기술로서, CG 영상 제작에 활용되며, 센서 부착 방식에서 마커리스 방식으로 발전하여 다양한 분야에 응용된다.
2. 역사
셰이더의 개념은 1988년 5월 픽사의 렌더맨 인터페이스 사양 버전 3.0 발표와 함께 대중에 소개되었다. 초기에는 고정 기능 파이프라인(Fixed Function Pipeline, FFP)이 주로 사용되었으나, 그래픽 처리 장치(GPU)가 발전하면서 프로그래밍 가능한 셰이더가 등장하였다.
OpenGL과 Direct3D 같은 주요 그래픽 소프트웨어 라이브러리들은 셰이더를 지원하기 시작했다. 초기에는 픽셀 셰이더만 지원했으나, 개발자들이 셰이더의 힘을 깨닫자 버텍스 셰이더가 빠르게 도입되었다. 2001년, 엔비디아 지포스 3(NV20)는 프로그래밍 가능한 픽셀 셰이더를 탑재한 최초의 비디오 카드였다. 지오메트리 셰이더는 Direct3D 10 및 OpenGL 3.2와 함께 도입되었다. 이후 그래픽 하드웨어는 통합 셰이더 모델로 발전하여, 모든 유형의 셰이더를 실행할 수 있게 되었다.
대한민국에서는 2000년대 초반 온라인 게임 시장의 급성장과 함께 셰이더 기술이 주목받기 시작했으며, 특히 '리니지2', '테라' 등의 게임은 높은 수준의 그래픽을 구현하기 위해 셰이더를 적극적으로 활용했다.
2.1. 대한민국 게임 산업과 셰이더
3. 셰이더의 종류
Direct3D와 오픈지엘 그래픽 라이브러리는 주로 세 가지 종류의 셰이더를 사용한다: 버텍스 셰이더, 지오메트리 셰이더, 픽셀 셰이더. 일반적으로 사용되는 셰이더에는 세 가지 유형(픽셀 셰이더, 버텍스 셰이더, 지오메트리 셰이더)이 있으며, 최근에는 테셀레이션 셰이더, 컴퓨트 셰이더 등 새로운 종류의 셰이더도 추가되었다. 구형 그래픽 카드는 각 셰이더 유형별로 별도의 처리 장치를 사용했지만, 최신 카드는 통합 셰이더를 통해 모든 유형의 셰이더를 실행할 수 있다.
; 버텍스 셰이더
Direct3D와 오픈지엘 그래픽 라이브러리에서 사용되는 셰이더 중 하나이다. 그래픽스 프로세서에 제공된 각 정점에 대해 한 번씩 실행된다. 버텍스 셰이더(버텍스 셰이더/Vertex Shader영어)는 각 정점을 처리하며, 정점 셰이더라고도 한다.
가상 공간에서 각 정점의 3D 위치를 화면에 표시되는 2D 좌표(및 Z-버퍼의 깊이 값)로 변환하는 것이 목적이다. 위치, 색상 및 텍스처 좌표와 같은 속성을 조작할 수 있지만, 새로운 정점을 생성할 수는 없다. 출력은 파이프라인의 다음 단계로 전달되며, 기하 셰이더가 존재할 경우 기하 셰이더이고, 그렇지 않은 경우 래스터라이저이다.
오브젝트를 구성하는 정점을 입력으로 받아 다양한 처리를 수행하고 정점을 출력한다. 3차원 공간 좌표, 법선 벡터, 색상, 텍스처 매핑 좌표를 입력으로 받으며, 그래픽스 API에 따라 텍스처에 대한 부차적인 접근이 제공된다. 일반적으로 모델 변환, 뷰 변환, 투영 변환을 수행하며, 정점 단위의 라이팅도 수행한다. 3D 모델과 관련된 모든 장면에서 위치, 움직임, 조명 및 색상의 세부 사항을 제어할 수 있다.
; 지오메트리 셰이더
Direct3D 10 및 OpenGL 3.2에 도입된 지오메트리 셰이더는 버텍스 셰이더 다음에 실행되며, 점, 선, 삼각형과 같은 프리미티브를 입력받아 새로운 프리미티브를 생성할 수 있다. 예를 들어, 삼각형에 대해 작동할 때 세 개의 정점이 지오메트리 셰이더의 입력이 된다.
지오메트리 셰이더는 출력한 프리미티브는 래스터화되고 해당 조각은 궁극적으로 픽셀 셰이더로 전달되거나 혹은 취소된다. 지오메트리 셰이더의 일반적인 사용 사례는 점 스프라이트 생성, 지오메트리 테셀레이션, 섀도 볼륨 돌출 및 큐브 맵으로의 단일 패스 렌더링 등이 있다. 지오메트리 셰이더의 이점을 보여주는 일반적인 실제 예로는 자동 메시 복잡성 수정이 있다. 곡선의 제어점을 나타내는 일련의 선 스트립이 지오메트리 셰이더로 전달되고, 필요한 복잡성에 따라 셰이더가 곡선을 더 잘 근사하는 추가 선을 자동으로 생성할 수 있다.
; 픽셀 셰이더 (프래그먼트 셰이더)
픽셀 셰이더(프래그먼트 셰이더)는 각 픽셀의 색상 및 기타 속성을 계산하는 셰이더이다. Direct3D와 오픈지엘 그래픽 라이브러리에서 사용되는 세 가지 셰이더 중 하나이다. 픽셀 셰이더는 프래그먼트 셰이더라고도 불리며, 각 "프래그먼트"의 색상 및 기타 속성을 계산하는데, 여기서 "프래그먼트"는 최대 하나의 출력 픽셀에 영향을 미치는 렌더링 작업의 단위이다.
픽셀 셰이더는 조명 값을 적용하고, 범프 매핑, 그림자, 반사 하이라이트, 반투명도 등 다양한 효과를 처리한다. 3D 그래픽뿐만 아니라 2D 이미지에도 적용될 수 있으며, 블러 또는 가장자리 감지/강화와 같은 2차원 후처리 효과를 만화/셀 셰이더에 적용할 수 있다.
픽셀 셰이더는 픽셀 단위의 라이팅이나 포스트 프로세스(후처리)를 수행하며, 래스터화되는 프리미티브의 각 픽셀에 영향을 미친다. 또한 텍스처를 참조하여 범프 매핑이나 안개, 그림자, 블룸과 같은 효과를 최종 렌더링 결과에 적용할 수 있다. 픽셀 조작 처리 시간은 입력 프리미티브의 래스터화 후 픽셀 수나 출력 해상도에 따라 달라지므로, 일반적으로 정점 단위 처리에 비해 부하가 높다. 그러나 픽셀 셰이더 프로그램을 통해 높은 병렬 처리 성능을 가진 GPU에서 실행함으로써, 이러한 고도화된 효과를 CPU에서 실행하는 것보다 훨씬 높은 성능으로 구현할 수 있다.
픽셀 셰이더는 깊이(깊이)도 조작할 수 있는데, 이는 렌더링 파이프라인의 최적화에 영향을 미치므로 셰이딩 언어나 그래픽스 API에 따라 플래그 명시가 요구될 수 있다(SPIR-V/Vulkan).
; 테셀레이션 셰이더
OpenGL 4.0 및 Direct3D 11부터 테셀레이션 셰이더라고 불리는 새로운 셰이더가 추가되었다. 테셀레이션 셰이더는 기존 모델에 테셀레이션 제어 셰이더(헐 셰이더라고도 함)와 테셀레이션 평가 셰이더(도메인 셰이더라고도 함)의 두 가지 새로운 셰이더 단계를 추가한다. 이 셰이더들은 런타임 시 수학적 함수에 따라 단순한 메시를 더 정교한 메시로 세분화할 수 있게 해준다.
테셀레이션 셰이더는 모델을 더 작은 삼각형으로 세분화하여 곡선 표현을 개선하거나, 카메라 거리에 따라 디테일 수준을 조정하는 데 사용된다. 이 함수는 다양한 변수와 관련될 수 있으며, 특히 뷰잉 카메라와의 거리를 통해 활성 레벨 오브 디테일 스케일링을 가능하게 한다. 이를 통해 카메라에 가까운 객체는 세밀한 디테일을 갖는 반면, 더 멀리 있는 객체는 더 거친 메시를 가질 수 있지만 품질은 유사하게 보이게 된다. 또한, 매우 복잡한 메시를 메모리에서 다운샘플링하는 대신 셰이더 유닛 내부에서 메시를 세분화할 수 있게 함으로써 필요한 메시 대역폭을 대폭 줄일 수 있다. 어떤 알고리즘은 임의의 메시를 업샘플링할 수 있으며, 다른 알고리즘은 메시 내에서 가장 특징적인 정점과 가장자리를 지시하는 "힌팅"을 허용한다.
; 컴퓨트 셰이더
Direct3D와 오픈지엘 그래픽 라이브러리에서 사용되는 셰이더 종류에는 버텍스 셰이더, 지오메트리 셰이더, 픽셀 셰이더가 있다. 컴퓨트 셰이더는 그래픽 응용 프로그램뿐만 아니라 GPGPU를 위해서도 사용되며, 그래픽 파이프라인에서 애니메이션, 타일 기반 전방향 렌더링과 같은 조명 알고리즘의 추가 단계에 활용될 수 있다. 일부 렌더링 API를 사용하면 컴퓨트 셰이더가 그래픽 파이프라인과 데이터 리소스를 쉽게 공유할 수 있다.
컴퓨트 셰이더는 범용 병렬 처리 (GPGPU)를 목적으로 하며, 셰이딩 언어로 기술된다. OpenGL 4.3 이후, OpenGL ES 3.1 이후, 및 Direct3D 11 이후에서 제공된다. Direct3D에서는 Direct3D API를 포함한 총칭으로 DirectCompute라고 불린다. GPGPU 전용 API·언어로는 CUDA와 OpenCL이 잘 알려져 있다.
3.1. 버텍스 셰이더
Direct3D와 오픈지엘 그래픽 라이브러리에서 사용되는 셰이더 중 하나이다. 그래픽스 프로세서에 제공된 각 정점에 대해 한 번씩 실행된다. 버텍스 셰이더(버텍스 셰이더/Vertex Shader영어)는 각 정점을 처리하며, 정점 셰이더라고도 한다.
가상 공간에서 각 정점의 3D 위치를 화면에 표시되는 2D 좌표(및 Z-버퍼의 깊이 값)로 변환하는 것이 목적이다. 위치, 색상 및 텍스처 좌표와 같은 속성을 조작할 수 있지만, 새로운 정점을 생성할 수는 없다. 출력은 파이프라인의 다음 단계로 전달되며, 기하 셰이더가 존재할 경우 기하 셰이더이고, 그렇지 않은 경우 래스터라이저이다.
오브젝트를 구성하는 정점을 입력으로 받아 다양한 처리를 수행하고 정점을 출력한다. 3차원 공간 좌표, 법선 벡터, 색상, 텍스처 매핑 좌표를 입력으로 받으며, 그래픽스 API에 따라 텍스처에 대한 부차적인 접근이 제공된다. 일반적으로 모델 변환, 뷰 변환, 투영 변환을 수행하며, 정점 단위의 라이팅도 수행한다. 3D 모델과 관련된 모든 장면에서 위치, 움직임, 조명 및 색상의 세부 사항을 제어할 수 있다.
3.2. 지오메트리 셰이더
Direct3D 10 및 OpenGL 3.2에 도입된 지오메트리 셰이더는 버텍스 셰이더 다음에 실행되며, 점, 선, 삼각형과 같은 프리미티브를 입력받아 새로운 프리미티브를 생성할 수 있다. 예를 들어, 삼각형에 대해 작동할 때 세 개의 정점이 지오메트리 셰이더의 입력이 된다.
지오메트리 셰이더는 출력한 프리미티브는 래스터화되고 해당 조각은 궁극적으로 픽셀 셰이더로 전달되거나 혹은 취소된다. 지오메트리 셰이더의 일반적인 사용 사례는 점 스프라이트 생성, 지오메트리 테셀레이션, 섀도 볼륨 돌출 및 큐브 맵으로의 단일 패스 렌더링 등이 있다. 지오메트리 셰이더의 이점을 보여주는 일반적인 실제 예로는 자동 메시 복잡성 수정이 있다. 곡선의 제어점을 나타내는 일련의 선 스트립이 지오메트리 셰이더로 전달되고, 필요한 복잡성에 따라 셰이더가 곡선을 더 잘 근사하는 추가 선을 자동으로 생성할 수 있다.
3.3. 픽셀 셰이더 (프래그먼트 셰이더)
픽셀 셰이더(프래그먼트 셰이더)는 각 픽셀의 색상 및 기타 속성을 계산하는 셰이더이다. Direct3D와 오픈지엘 그래픽 라이브러리에서 사용되는 세 가지 셰이더 중 하나이다. 픽셀 셰이더는 프래그먼트 셰이더라고도 불리며, 각 "프래그먼트"의 색상 및 기타 속성을 계산하는데, 여기서 "프래그먼트"는 최대 하나의 출력 픽셀에 영향을 미치는 렌더링 작업의 단위이다.
픽셀 셰이더는 조명 값을 적용하고, 범프 매핑, 그림자, 반사 하이라이트, 반투명도 등 다양한 효과를 처리한다. 3D 그래픽뿐만 아니라 2D 이미지에도 적용될 수 있으며, 블러 또는 가장자리 감지/강화와 같은 2차원 후처리 효과를 만화/셀 셰이더에 적용할 수 있다.
픽셀 셰이더는 픽셀 단위의 라이팅이나 포스트 프로세스(후처리)를 수행하며, 래스터화되는 프리미티브의 각 픽셀에 영향을 미친다. 또한 텍스처를 참조하여 범프 매핑이나 안개, 그림자, 블룸과 같은 효과를 최종 렌더링 결과에 적용할 수 있다. 픽셀 조작 처리 시간은 입력 프리미티브의 래스터화 후 픽셀 수나 출력 해상도에 따라 달라지므로, 일반적으로 정점 단위 처리에 비해 부하가 높다. 그러나 픽셀 셰이더 프로그램을 통해 높은 병렬 처리 성능을 가진 GPU에서 실행함으로써, 이러한 고도화된 효과를 CPU에서 실행하는 것보다 훨씬 높은 성능으로 구현할 수 있다.
픽셀 셰이더는 깊이(깊이)도 조작할 수 있는데, 이는 렌더링 파이프라인의 최적화에 영향을 미치므로 셰이딩 언어나 그래픽스 API에 따라 플래그 명시가 요구될 수 있다(SPIR-V/Vulkan).
3.4. 테셀레이션 셰이더
OpenGL 4.0 및 Direct3D 11부터 테셀레이션 셰이더라고 불리는 새로운 셰이더가 추가되었다. 테셀레이션 셰이더는 기존 모델에 테셀레이션 제어 셰이더(헐 셰이더라고도 함)와 테셀레이션 평가 셰이더(도메인 셰이더라고도 함)의 두 가지 새로운 셰이더 단계를 추가한다. 이 셰이더들은 런타임 시 수학적 함수에 따라 단순한 메시를 더 정교한 메시로 세분화할 수 있게 해준다.
테셀레이션 셰이더는 모델을 더 작은 삼각형으로 세분화하여 곡선 표현을 개선하거나, 카메라 거리에 따라 디테일 수준을 조정하는 데 사용된다. 이 함수는 다양한 변수와 관련될 수 있으며, 특히 뷰잉 카메라와의 거리를 통해 활성 레벨 오브 디테일 스케일링을 가능하게 한다. 이를 통해 카메라에 가까운 객체는 세밀한 디테일을 갖는 반면, 더 멀리 있는 객체는 더 거친 메시를 가질 수 있지만 품질은 유사하게 보이게 된다. 또한, 매우 복잡한 메시를 메모리에서 다운샘플링하는 대신 셰이더 유닛 내부에서 메시를 세분화할 수 있게 함으로써 필요한 메시 대역폭을 대폭 줄일 수 있다. 어떤 알고리즘은 임의의 메시를 업샘플링할 수 있으며, 다른 알고리즘은 메시 내에서 가장 특징적인 정점과 가장자리를 지시하는 "힌팅"을 허용한다.
3.5. 컴퓨트 셰이더
Direct3D와 오픈지엘 그래픽 라이브러리에서 사용되는 셰이더 종류에는 버텍스 셰이더, 지오메트리 셰이더, 픽셀 셰이더가 있다. 컴퓨트 셰이더는 그래픽 응용 프로그램뿐만 아니라 GPGPU를 위해서도 사용되며, 그래픽 파이프라인에서 애니메이션, 타일 기반 전방향 렌더링과 같은 조명 알고리즘의 추가 단계에 활용될 수 있다. 일부 렌더링 API를 사용하면 컴퓨트 셰이더가 그래픽 파이프라인과 데이터 리소스를 쉽게 공유할 수 있다.
컴퓨트 셰이더는 범용 병렬 처리 (GPGPU)를 목적으로 하며, 셰이딩 언어로 기술된다. OpenGL 4.3 이후, OpenGL ES 3.1 이후, 및 Direct3D 11 이후에서 제공된다. Direct3D에서는 Direct3D API를 포함한 총칭으로 DirectCompute라고 불린다. GPGPU 전용 API·언어로는 CUDA와 OpenCL이 잘 알려져 있다.
4. 셰이더 프로그래밍
셰이더는 대상 환경에 따라 다양한 언어로 프로그래밍된다. OpenGL의 공식 셰이딩 언어는 OpenGL Shading Language(GLSL)이다. Direct3D의 셰이딩 언어는 High Level Shader Language(HLSL)이다. Nvidia의 Cg는 OpenGL과 Direct3D 셰이더를 모두 출력할 수 있었으나, 2012년부터 사용이 중단되었다. 애플은 Metal 프레임워크의 일부로 Metal Shading Language를 사용한다.
최근에는 유니티, 언리얼 엔진 등 게임 엔진에서 노드 기반 셰이더 에디터를 제공하여, 코드 작성 없이 셰이더를 생성할 수 있도록 지원한다.
5. 셰이더와 병렬 처리
셰이더는 화면 영역의 각 픽셀 또는 모델의 모든 정점과 같이, 한 번에 많은 수의 요소에 변환을 적용하도록 작성된다. 이는 병렬 처리에 적합하며, 대부분의 최신 GPU는 이를 용이하게 하기 위해 여러 개의 셰이더 그래픽 파이프라인을 갖추고 있어 계산 처리량을 크게 향상시킨다.
셰이더를 사용한 프로그래밍 모델은 렌더링을 위한 고차 함수와 유사하며, 셰이더를 인수로 사용하고 중간 결과 간의 특정 데이터 흐름을 제공하여 데이터 병렬 처리 (픽셀, 정점 등)와 파이프라인 병렬 처리 (단계 간)를 모두 가능하게 한다. ( 맵 리듀스 참조).
6. 셰이더의 활용 분야
셰이더 내에서 구현되는 그래픽스 알고리즘은 용도에 따라 다르게 사용된다.
영화 등 프로덕션 용도의 셰이더는 시간이 오래 걸리지만 고품질의 사실적인 결과를 생성한다. en에 기반한 레이 트레이싱이나 라디오시티, 포톤 매핑 등, 보다 엄밀한 전역 조명(글로벌 일루미네이션) 기반의 물리 기반 음영 계산 모델이 사용된다. 예를 들어, 픽사(PIXAR)의 렌더맨(RenderMan)은 글로벌 일루미네이션을 지원한다.
게임 등 실시간 용도의 셰이더는 품질과 속도 간의 균형(트레이드 오프)이 중요시된다. 상호 반사 등을 고려하지 않는 간소하고 빠른 국소 조명(로컬 일루미네이션) 기반의 음영 계산 모델이나 Z 버퍼 기법이 사용되는 경우가 대부분이다. GPU의 발전과 실시간용 프로그래밍 가능 셰이더의 발전에 따라, 알고리즘과 데이터 구조를 개선하여 글로벌 일루미네이션을 실시간으로 구현하는 예도 등장했지만, 2018년 시점에서도 아직 발전 단계에 있는 기술이다.
실시간 용도의 셰이더는 CG 프로덕션 소프트웨어의 미리 보기에도 사용된다. 예를 들어 3ds 맥스(Autodesk 3ds Max), 마야(Autodesk Maya), 소프트이미지(Autodesk Softimage), 그리고 라이트웨이브(NewTek LightWave 3D)가 미리 보기 기능을 제공한다.
2DCG 소프트웨어에도 액셀러레이터로 종종 도입된다(예: 어도비 포토샵(Adobe Photoshop)이나 어도비 플래시(Adobe Flash)). GUI 기반 운영 체제(OS)의 데스크톱 합성 엔진 및 표준 2D 그래픽스 API, 구체적으로는 윈도우 에어로(Windows Aero)/Direct2D(윈도우) 또는 쿼츠 익스트림(Quartz Extreme)/Core Image(macOS)가 그 예시이다.
대한민국에서는 게임 산업을 중심으로 셰이더 기술이 발전해 왔으며, 최근에는 모바일 환경에 최적화된 셰이더 개발이 활발히 이루어지고 있다.