셰이더

컴퓨터 그래픽스에서 셰이더(shader)는 셰이딩으로 알려진 과정인 3차원 장면의 렌더링 동안 적절한 수준의 빛, 어둠 및 색을 계산하는 컴퓨터 프로그램이다. 셰이더는 컴퓨터 그래픽스 특수 효과 및 비디오 후처리뿐만 아니라 GPGPU에서 다양한 특수 기능을 수행하도록 발전했다.

기존 셰이더는 높은 유연성을 가지고 그래픽 하드웨어에서 렌더링 효과를 계산한다. 대부분의 셰이더는 그래픽 처리 장치 (GPU)용으로 코딩되고 (그 위에서) 실행되지만, 이는 엄격한 요구사항이 아니다. 셰이딩 언어는 GPU의 그래픽스 파이프라인을 프로그래밍하는 데 사용되며, 이는 일반적인 기하학 변환 및 픽셀 셰이딩 기능만 허용했던 과거의 고정 기능 파이프라인을 대부분 대체했다. 셰이더를 사용하면 사용자 정의 효과를 사용할 수 있다. 최종 렌더링된 이미지를 구성하는 데 사용되는 모든 화소, 정점 및 텍스처의 위치와 색 (색상, 채도, 명도, 대비)는 셰이더에 정의된 알고리즘을 사용하여 변경할 수 있으며, 셰이더를 호출하는 컴퓨터 프로그램이 도입하는 외부 변수 또는 텍스처에 의해 수정될 수 있다.

셰이더는 영화 후처리, 컴퓨터 생성 이미지, 비디오 게임에서 다양한 효과를 생성하는 데 널리 사용된다. 단순한 조명 모델을 넘어선 셰이더의 복잡한 용도는 다음과 같습니다: 이미지의 색상, 채도, 명도 (HSL/HSV) 또는 대비 변경; 블러, 광선 블룸, 볼류메트릭 조명, 법선 매핑 (깊이 효과용), 보케, 셀 셰이딩, 포스터화, 범프 매핑, 왜곡, 크로마키 (소위 "블루스크린/그린스크린" 효과용), 윤곽선 및 움직임 감지, 그리고 데모씬에서 볼 수 있는 것과 같은 환각적인 효과.

 역사 
"셰이더"라는 용어가 대중에게 알려진 최초의 사용은 1988년 5월에 처음 출판된 픽사의 렌더맨 인터페이스(RenderMan Interface) 사양 버전 3.0에 의해 도입되었다.

그래픽 처리 장치가 발전함에 따라 OpenGL 및 Direct3D와 같은 주요 그래픽스 소프트웨어 라이브러리는 셰이더를 지원하기 시작했다. 최초의 셰이더 지원 GPU는 픽셀 셰이딩만 지원했지만, 개발자들이 셰이더의 강력함을 깨닫자마자 정점 셰이더가 빠르게 도입되었다. 프로그래밍 가능한 픽셀 셰이더를 갖춘 최초의 비디오 카드는 2001년에 출시된 엔비디아 GeForce 3 (NV20)였다. 지오메트리 셰이더는 Direct3D 10 및 OpenGL 3.2와 함께 도입되었다. 결국, 그래픽스 하드웨어는 통합 셰이더 모델로 발전했다.

 설계 
셰이더는 정점 또는 화소의 특성을 설명하는 간단한 프로그램이다. 정점 셰이더는 정점의 속성(위치, 텍스처 좌표, 색상 등)을 설명하는 반면, 픽셀 셰이더는 픽셀의 특성(색상, Z-깊이 및 알파 값)을 설명한다. 정점 셰이더는 프리미티브의 각 정점에 대해 호출된다(아마도 테셀레이션 후에). 따라서 하나의 정점이 들어가면 하나의 (업데이트된) 정점이 나온다. 각 정점은 나중에 화면으로 전송될 표면(메모리 블록)에 일련의 픽셀로 렌더링된다.

셰이더는 일반적으로 고정 기능 파이프라인(FFP)이라고 불리는 그래픽스 하드웨어의 한 부분을 대체한다. 이는 하드 코딩된 방식으로 조명 및 텍스처 매핑을 수행하기 때문에 그렇게 불린다. 셰이더는 이 하드 코딩된 접근 방식에 프로그래밍 가능한 대안을 제공한다.

기본적인 그래픽스 파이프라인은 다음과 같습니다:

 CPU는 그래픽스 카드에 위치한 그래픽 처리 장치로 명령(컴파일된 셰이딩 언어 프로그램)과 기하학 데이터를 보낸다.
 정점 셰이더 내에서 기하학이 변환된다.
 그래픽 처리 장치에 지오메트리 셰이더가 있고 활성화되어 있다면, 장면의 기하학에 대한 일부 변경이 수행된다.
 그래픽 처리 장치에 테셀레이션 셰이더가 있고 활성화되어 있다면, 장면의 기하학이 세분화될 수 있다.
 계산된 기하학은 삼각형화된다(삼각형으로 세분화됩니다).
 삼각형은 조각 쿼드로 분할됩니다 (하나의 조각 쿼드는 2 × 2 조각 프리미티브입니다).
 조각 쿼드는 조각 셰이더에 따라 수정된다.
 깊이 테스트가 수행됩니다; 통과하는 조각은 화면에 기록되고 프레임 버퍼로 혼합될 수 있다.

그래픽 파이프라인은 이러한 단계를 사용하여 3차원(또는 2차원) 데이터를 표시를 위한 유용한 2차원 데이터로 변환한다. 일반적으로 이것은 큰 픽셀 매트릭스 또는 "프레임 버퍼"이다.

 종류 
일반적으로 사용되는 셰이더에는 세 가지 유형(픽셀, 정점, 지오메트리 셰이더)이 있으며, 최근에 몇 가지가 더 추가되었다. 구형 그래픽스 카드는 각 셰이더 유형에 대해 별도의 처리 장치를 사용했지만, 최신 카드는 모든 유형의 셰이더를 실행할 수 있는 통합 셰이더를 특징으로 한다. 이를 통해 그래픽스 카드는 처리 능력을 더욱 효율적으로 사용할 수 있다.

 2D 셰이더 
2D 셰이더는 컴퓨터 그래픽스 분야에서 텍스처라고도 불리는 디지털 이미지에 작용한다. 이들은 화소의 속성을 수정한다. 2D 셰이더는 3차원 기하학을 렌더링하는 데 참여할 수 있다. 현재 유일한 2D 셰이더 유형은 픽셀 셰이더이다.

 픽셀 셰이더 
프래그먼트 셰이더로도 알려진 픽셀 셰이더는 각 "프래그먼트"의 색 및 기타 속성을 계산한다. 프래그먼트는 최대 하나의 출력 화소에 영향을 미치는 렌더링 작업의 단위이다. 가장 간단한 종류의 픽셀 셰이더는 하나의 화면 화소를 색상 값으로 출력한다. 여러 입출력을 가진 더 복잡한 셰이더도 가능하다. 픽셀 셰이더는 단순히 항상 동일한 색상을 출력하는 것부터 조명 값 적용, 범프 매핑, 그림자, 반사 하이라이트, 반투명 및 기타 현상 수행에 이르기까지 다양하다. 이들은 프래그먼트의 깊이를 변경하거나 (Z 버퍼링용), 여러 렌더링 대상이 활성 상태인 경우 두 개 이상의 색상을 출력할 수 있다. 3차원 그래픽스에서 픽셀 셰이더 단독으로는 장면의 기하학(즉, 정점 데이터)에 대한 지식 없이 단일 프래그먼트에서만 작동하기 때문에 일부 종류의 복잡한 효과를 생성할 수 없다. 그러나 픽셀 셰이더는 그려지는 화면 좌표에 대한 지식을 가지고 있으며, 전체 화면 내용이 셰이더에 텍스처로 전달되면 화면 및 인근 픽셀을 샘플링할 수 있다. 이 기술은 블러 또는 만화/셀 셰이더를 위한 윤곽선 감지/강화와 같은 다양한 2차원 후처리 효과를 가능하게 한다. 픽셀 셰이더는 그래픽스 파이프라인의 어떤 2차원 이미지(스프라이트 또는 텍스처)의 중간 단계에서도 적용될 수 있지만, 정점 셰이더는 항상 3차원 장면을 필요로 한다. 예를 들어, 픽셀 셰이더는 래스터화된 후 후처리기 또는 필터로 작동할 수 있는 유일한 종류의 셰이더이다.

 3D 셰이더 
3D 셰이더는 3차원 모델 또는 다른 기하학에 작용하지만 모델이나 메시를 그리는 데 사용되는 색상과 텍스처에도 접근할 수 있다. 정점 셰이더는 가장 오래된 유형의 3D 셰이더로, 일반적으로 정점 단위로 수정한다. 최신 지오메트리 셰이더는 셰이더 내에서 새로운 정점을 생성할 수 있다. 테셀레이션 셰이더는 가장 새로운 3D 셰이더이다. 이들은 한 번에 여러 정점 배치에 작용하여 모델을 런타임에 더 작은 삼각형 그룹 또는 다른 기본 도형으로 세분화하는 등 세부 사항을 추가하여 곡선 및 범프와 같은 것을 개선하거나 다른 속성을 변경할 수 있다.

 정점 셰이더 
정점 셰이더 또는 버텍스 셰이더(vertex shader)는 그래픽스 프로세서에 주어진 각 3차원 정점에 대해 한 번 실행된다. 목적은 각 정점의 가상 공간에서의 3차원 위치를 화면에 나타나는 2차원 좌표(및 Z 버퍼의 깊이 값)로 변환하는 것이다. 정점 셰이더는 위치, 색상, 텍스처 좌표와 같은 속성을 조작할 수 있지만 새로운 정점을 생성할 수는 없다. 정점 셰이더의 출력은 파이프라인의 다음 단계인 (존재한다면) 지오메트리 셰이더 또는 래스터화기로 전달된다. 정점 셰이더는 3차원 모델을 포함하는 모든 장면에서 위치, 움직임, 조명 및 색상의 세부 사항을 강력하게 제어할 수 있게 해준다.

 지오메트리 셰이더 
지오메트리 셰이더는 Direct3D 10 및 OpenGL 3.2에 도입되었다. 이전에는 확장을 사용하여 OpenGL 2.0+에서 사용할 수 있었다.Geometry Shader - OpenGL. Retrieved on December 21, 2011. 이 유형의 셰이더는 그래픽스 파이프라인의 시작 부분으로 전송된 프리미티브로부터 점, 선, 삼각형과 같은 새로운 그래픽스 프리미티브를 생성할 수 있다.

지오메트리 셰이더 프로그램은 정점 셰이더 다음에 실행된다. 이들은 인접성 정보를 포함하여 전체 프리미티브를 입력으로 받는다. 예를 들어, 삼각형에 대해 작동할 때 세 개의 정점이 지오메트리 셰이더의 입력이 된다. 셰이더는 이후 0개 이상의 프리미티브를 방출하며, 이들은 래스터화되고 그 조각들은 궁극적으로 픽셀 셰이더로 전달된다.

지오메트리 셰이더의 일반적인 용도는 점 스프라이트 생성, 지오메트리 테셀레이션, 그림자 볼륨 돌출, 그리고 단일 패스 렌더링을 큐브 맵으로 하는 것이다. 지오메트리 셰이더의 이점을 보여주는 전형적인 실제 사례는 자동 메시 복잡도 수정이다. 곡선의 제어점을 나타내는 일련의 선 스트립이 지오메트리 셰이더에 전달되고, 요구되는 복잡도에 따라 셰이더는 곡선을 더 잘 근사하는 추가적인 선을 자동으로 생성할 수 있다.

 테셀레이션 셰이더 
OpenGL 4.0 및 Direct3D 11부터 테셀레이션 셰이더라는 새로운 셰이더 클래스가 추가되었다. 이 클래스는 기존 모델에 테셀레이션 제어 셰이더(헐 셰이더로도 알려짐)와 테셀레이션 평가 셰이더(도메인 셰이더로도 알려짐)라는 두 가지 새로운 셰이더 단계를 추가한다. 이 두 셰이더는 함께 더 간단한 메시를 수학 함수에 따라 런타임에 더 미세한 메시로 세분화할 수 있도록 한다. 이 함수는 다양한 변수와 관련될 수 있으며, 가장 주목할 만한 것은 시야 카메라와의 거리로, 활성 세부 수준 확대를 허용한다. 이를 통해 카메라에 가까운 객체는 미세한 디테일을 가질 수 있고, 더 멀리 있는 객체는 더 거친 메시를 가질 수 있지만 품질은 유사하게 보인다. 또한 메모리에서 매우 복잡한 메시를 다운샘플링하는 대신 셰이더 유닛 내에서 메시를 정제할 수 있도록 하여 필요한 메시 대역폭을 극적으로 줄일 수 있다. 일부 알고리즘은 임의의 메시를 업샘플링할 수 있지만, 다른 알고리즘은 메시에서 가장 특징적인 정점과 모서리를 지정하는 "힌트"를 허용한다.

 프리미티브 및 메시 셰이더 
2017년경, AMD 베가 마이크로아키텍처는 지오메트리 처리에 필요한 데이터에 접근할 수 있는 컴퓨트 셰이더와 다소 유사한 새로운 셰이더 단계인 프리미티브 셰이더를 지원하기 시작했다.

엔비디아는 2018년 튜링 마이크로아키텍처와 함께 컴퓨트 셰이더를 기반으로 모델링된 메시 및 태스크 셰이더를 도입했다. 엔비디아 튜링은 암페어 RTX 30 시리즈가 출시되기 몇 달 전 DirectX 12 Ultimate API를 통해 메시 셰이딩을 지원하는 세계 최초의 GPU 마이크로아키텍처이다.

2020년, AMD와 엔비디아는 RDNA 2 및 암페어 마이크로아키텍처를 출시했으며, 둘 다 DirectX 12 Ultimate를 통해 메시 셰이딩을 지원한다. 이 메시 셰이더는 GPU가 더 복잡한 알고리즘을 처리하도록 하여 CPU에서 GPU로 더 많은 작업을 오프로드하고, 알고리즘 집약적인 렌더링에서 장면의 프레임 속도나 삼각형 수를 몇 배나 증가시킬 수 있다. 인텔은 2022년 1분기 출하될 인텔 아크 알케미스트 GPU가 메시 셰이더를 지원할 것이라고 발표했다.

 통합 셰이더 
통합 셰이더는 2D 셰이더와 3D 셰이더를 결합한 것이다. 엔비디아는 "통합 셰이더"를 "CUDA 코어"라고 불렀고, AMD는 이를 "셰이더 코어"라고 불렀으며, 인텔은 "ALU 코어"라고 불렀다.

 컴퓨트 셰이더 
컴퓨트 셰이더는 그래픽스 애플리케이션에만 국한되지 않고, GPGPU를 위해 동일한 실행 자원을 사용한다. 이들은 애니메이션 또는 조명 알고리즘(예: 타일 기반 포워드 렌더링)의 추가 단계에 그래픽스 파이프라인에서 사용될 수 있다. 일부 렌더링 API는 컴퓨트 셰이더가 그래픽스 파이프라인과 데이터 자원을 쉽게 공유하도록 허용한다.

 광선 추적 셰이더 
광선 추적 셰이더는 마이크로소프트의 DirectX Raytracing, 크로노스 그룹의 벌칸, GLSL, SPIR-V를 통해 지원된다. 애플의 메탈을 통해 지원된다. 엔비디아와 AMD는 "광선 추적 셰이더"를 "광선 추적 코어"라고 불렀다. 통합 셰이더와 달리 하나의 광선 추적 셰이더는 여러 개의 ALU를 포함할 수 있다.

 텐서 셰이더 
텐서 셰이더는 NPU 또는 GPU에 통합될 수 있다. 텐서 셰이더는 마이크로소프트의 DirectML, 크로노스 그룹의 OpenVX, 애플의 Core ML, 구글의 텐서플로, 리눅스 재단의 ONNX를 통해 지원된다. 엔비디아와 AMD는 "텐서 셰이더"를 "텐서 코어"라고 불렀다. 통합 셰이더와 달리 하나의 텐서 셰이더는 여러 개의 ALU를 포함할 수 있다.

 병렬 처리 
셰이더는 한 번에 많은 수의 요소에 변환을 적용하도록 작성된다. 예를 들어, 화면의 영역 내 각 픽셀에 적용하거나 모델의 각 정점에 적용한다. 이는 병렬 처리에 매우 적합하며, 대부분의 최신 GPU는 이를 용이하게 하기 위해 여러 셰이더 그래픽스 파이프라인을 가지고 있어 계산 처리량을 크게 향상시킨다.

셰이더를 사용하는 프로그래밍 모델은 렌더링을 위한 고차 함수와 유사하며, 셰이더를 인수로 취하고 중간 결과 간에 특정 데이터 흐름을 제공하여 데이터 병렬 처리 (픽셀, 정점 등에서) 및 파이프라인 병렬 처리 (단계 간)를 모두 가능하게 한다. (또한 맵리듀스 참조).

 프로그래밍 
셰이더가 프로그래밍되는 언어는 대상 환경에 따라 다르다. 공식 OpenGL 및 OpenGL ES 셰이딩 언어는 OpenGL 셰이딩 언어, 또는 GLSL로 알려져 있으며, 공식 Direct3D 셰이딩 언어는 고수준 셰이더 언어, 또는 HLSL로 알려져 있다. OpenGL과 Direct3D 셰이더를 모두 출력하는 타사 셰이딩 언어인 Cg는 엔비디아에 의해 개발되었지만, 2012년부터는 사용되지 않는다. 애플은 메탈 프레임워크의 일부로 자체 셰이딩 언어인 메탈 셰이딩 언어를 출시했다.

 GUI 셰이더 편집기 
유니티, 언리얼 엔진 및 고도와 같은 최신 비디오 게임 개발 플랫폼은 실제 코드가 필요 없이 셰이더를 생성할 수 있는 노드 기반 편집기를 점점 더 많이 포함하고 있다. 사용자는 대신 다양한 텍스처, 맵 및 수학 함수를 확산 색상, 반사 색상 및 강도, 거칠기/금속성, 높이, 법선 등과 같은 출력 값으로 전달할 수 있는 연결된 노드의 유향 그래프를 제공받는다. 자동 컴파일은 그래프를 실제 컴파일된 셰이더로 변환한다.

 같이 보기 
 셰이딩
 GPGPU

 각주 

 외부 링크 
 OpenGL 지오메트리 셰이더 확장
 맥 OpenGL 셰이더 제작 프로그램

분류:3차원 컴퓨터 그래픽스
분류:셰이딩