셰이딩 언어

**셰이딩 언어**(Shading language)는 셰이더 효과 프로그래밍에 적용된 프로그래밍 언어이다. 셰이딩 언어는 일반적으로 "벡터", "행렬", "색상" 및 "법선"과 같은 특수한 자료형으로 구성된다.

## 오프라인 렌더링
오프라인 렌더링에 사용되는 셰이딩 언어는 자연어에 가까운 경향이 있어 프로그래밍에 대한 특별한 지식이 필요하지 않다. 오프라인 렌더링은 실시간 렌더링보다 더 많은 시간과 컴퓨팅 비용을 들여 최대 품질의 이미지를 생성하는 것을 목표로 한다.

### 렌더맨 셰이딩 언어
렌더맨 셰이딩 언어 (줄여서 RSL 또는 SL)는 렌더맨 인터페이스 명세에 정의된 언어로, 프로덕션 품질 렌더링을 위한 일반적인 셰이딩 언어이다. 또한 구현된 최초의 셰이딩 언어 중 하나이다.

이 언어는 6가지 주요 셰이더 유형을 정의한다.
* 광원 셰이더는 광원의 한 지점에서 대상 표면의 한 지점으로 방출되는 빛의 색상을 계산한다.
* 표면 셰이더는 들어오는 빛과 물체의 물리적 속성을 기반으로 물체 표면의 점의 색상과 위치를 모델링한다.
* 변위 셰이더는 색상과 독립적으로 표면 형상을 조작한다.
* 변형 셰이더는 전체 공간을 변환한다. RenderMan 구현 중 AIR 렌더러는 이 셰이더 유형을 구현하여 공간에 적용되는 단일 선형 변환만 지원했다.
* 볼륨 셰이더는 볼륨을 통과하는 빛의 색상을 조작한다. 이들은 안개와 같은 효과를 생성한다.
* 이미저 셰이더는 최종 픽셀 값에 대한 색상 변환을 설명한다. 이는 이미지 필터와 유사하지만, 이미저 셰이더는 양자화 이전에 데이터에 작동한다. 이러한 데이터는 일반적인 출력 장치에 표시될 수 있는 것보다 더 넓은 동적 범위와 색상 해상도를 가진다.

### 후디니 VEX 셰이딩 언어
후디니 VEX(Vector Expressions) 셰이딩 언어(종종 "VEX"로 약칭됨)는 RenderMan을 면밀히 모델링했다. 그러나 완전한 3D 패키지에 통합되었다는 것은 셰이더 작성자가 셰이더 내부의 정보에 접근할 수 있음을 의미하며, 이는 렌더링 컨텍스트에서는 일반적으로 사용할 수 없는 기능이다. RSL과 VEX 간의 언어 차이는 주로 구문적이며, 여러 shadeop 이름의 차이도 있다.

### 젤라토 셰이딩 언어
젤라토의 셰이딩 언어는 후디니의 VEX처럼 RenderMan을 면밀히 모델링했다. 젤라토 셰이딩 언어와 RSL의 차이는 주로 구문적이다. 젤라토는 함수 정의에서 인수를 구분하기 위해 쉼표 대신 세미콜론을 사용하며 몇몇 shadeop의 이름과 매개변수가 다르다.

### 오픈 셰이딩 언어
오픈 셰이딩 언어(OSL)는 소니 픽처스 이미지워크스가 오토데스크 아널드 렌더러에서 사용하기 위해 개발했다. 또한 블렌더의 사이클 렌더 엔진에서도 사용된다. OSL의 표면 및 볼륨 셰이더는 표면 또는 볼륨이 빛을 어떻게 산란시키는지를 중요도 샘플링을 허용하는 방식으로 정의한다. 따라서 광선 추적 및 글로벌 일루미네이션을 지원하는 물리 기반 렌더러에 적합하다.

## 실시간 렌더링
실시간 렌더링을 위한 셰이딩 언어는 현재 널리 사용된다. 이들은 하드웨어 추상화를 높이고 이전 패러다임(변환 및 셰이딩 방정식을 하드코딩한)보다 더 유연한 프로그래밍 모델을 제공한다. 이들은 더 적은 오버헤드로 더 많은 제어와 풍부한 콘텐츠를 제공한다.

GPU에서 직접 실행되도록 설계된 셰이더는 스트림 프로그래밍 모델 덕분에 높은 처리량의 일반 처리에서 유용해졌다. 이는 유사한 하드웨어에서 실행되는 컴퓨트 셰이더 개발로 이어졌다(참조: GPGPU).

역사적으로 몇몇 언어가 시장을 지배했으며, 아래에서 설명한다.

### ARB 어셈블리 언어
OpenGL 아키텍처 검토 위원회는 2002년에 ARB 어셈블리 언어를 프로그래밍 가능한 그래픽 프로세서를 위한 표준 저수준 명령어 집합으로 확립했다.

고수준 OpenGL 셰이딩 언어는 종종 로딩 및 실행을 위해 ARB 어셈블리로 컴파일된다. 고수준 셰이딩 언어와 달리 ARB 어셈블리는 제어 흐름이나 분기를 지원하지 않는다. 그러나 GPU 간 이식성이 필요할 때 계속 사용된다.

### OpenGL 셰이딩 언어
GLSL 또는 glslang으로도 알려진 이 표준화된 셰이딩 언어는 OpenGL과 함께 사용하기 위한 것이다.

이 언어는 정점 및 프래그먼트 처리를 단일 명령어 집합으로 통합하여 조건부 루프 및 분기를 허용한다. GLSL은 ARB 어셈블리 언어 이전에 있었다.

### Cg 프로그래밍 언어
엔비디아가 개발한 Cg 언어는 쉽고 효율적인 생산 파이프라인 통합을 위해 설계되었다. 이 언어는 API 독립성을 특징으로 하며 자산 관리를 개선하는 많은 무료 도구와 함께 제공된다. Cg 개발은 2012년에 중단되었으며, 현재는 사용되지 않는 언어이다.

### DirectX 셰이더 어셈블리 언어
Direct3D 8 및 9의 셰이더 어셈블리 언어는 셰이더 모델 1.0/1.1, 2.0 및 3.0에서 정점 셰이더 및 픽셀 셰이더의 주요 프로그래밍 언어이다. 이는 그래픽 드라이버로 실행을 위해 전달되는 중간 셰이더 바이트코드의 직접적인 표현이다.

셰이더 어셈블리 언어는 통합 셰이더 모델 4.0, 4.1, 5.0 및 5.1을 직접 프로그래밍하는 데 사용할 수 없지만, 디버깅 목적으로 중간 바이트코드의 표현 기능을 유지한다.

### DirectX 고수준 셰이더 언어
고수준 셰이딩 언어(HLSL)는 DirectX 9 이상 및 Xbox 게임 콘솔용 C-스타일 셰이더 언어이다. 엔비디아의 Cg와 관련이 있지만 DirectX 및 Xbox에서만 지원된다. HLSL 프로그램은 DirectX 셰이더 어셈블리 언어에 해당하는 바이트코드로 컴파일된다.

HLSL은 Direct3D 9에서 셰이더 어셈블리 언어의 선택적 대안으로 도입되었지만, 셰이더 어셈블리 언어가 사용되지 않는 Direct3D 10 이상에서는 필수가 되었다.

### 어도비 픽셀 벤더 및 어도비 그래픽 어셈블리 언어
어도비 시스템즈는 어도비 플래시 10 API의 일부로 픽셀 벤더를 추가했다. 픽셀 벤더는 픽셀 데이터만 처리할 수 있었고 3D 정점 데이터는 처리할 수 없었다. 플래시 11은 Stage3D라는 완전히 새로운 3D API를 도입했으며, 이는 어도비 그래픽 어셈블리 언어(AGAL)라는 자체 셰이딩 언어를 사용하며 완전한 3D 가속을 지원한다. 플래시 11.8에서 픽셀 벤더에 대한 GPU 가속이 제거되었다.

AGAL은 저수준이지만 플랫폼 독립적인 셰이딩 언어로, 예를 들어 ARB 어셈블리 언어로 또는 GLSL로 컴파일될 수 있다.

### 플레이스테이션 셰이더 언어
소니그룹은 Cg/HLSL과 유사하지만 플레이스테이션 4에 특화된 셰이딩 언어로 플레이스테이션  셰이더 언어(PSSL)를 발표했다. PSSL은 DirectX 12의 HLSL 셰이더 언어와 대체로 호환되지만, PS4 및 PS5 플랫폼을 위한 추가 기능을 갖춘 것으로 알려져 있다.

### 메탈 셰이딩 언어
애플은 2012년 이후에 출시된 대부분의 Mac과 5S 이후의 아이폰, 아이패드 에어 이후의 아이패드에서 실행되는 Metal이라는 저수준 그래픽스 API를 개발했다. Metal은 C++14 기반의 Metal Shading Language(MSL)라는 자체 셰이딩 언어를 가지고 있으며, 클랭과 LLVM을 사용하여 구현되었다. MSL은 정점, 프래그먼트 및 컴퓨트 처리를 통합한다.

### WebGPU 셰이딩 언어
WebGPU 셰이딩 언어(WGSL)는 WebGPU를 위한 셰이더 언어이다. 즉, WebGPU API를 사용하는 애플리케이션은 WGSL을 사용하여 GPU에서 실행되는 셰이더로 알려진 프로그램을 표현한다.

## 번역
셰이더를 한 셰이딩 언어에서 다른 언어로 이식하기 위해 몇 가지 접근 방식이 사용된다.
* 공통 인터페이스를 정의한다. 예를 들어, Cg/HLSL, GLSL 및 MSL은 모두 C 전처리기 매크로를 구현하므로 모든 다른 작업을 공통 인터페이스로 래핑하는 것이 가능하다. Valve의 Source 2 및 엔비디아의 FXAA 3.11이 이 방식을 사용한다.
* 한 언어를 다른 언어로 번역한다. 예를 들어, DirectX 바이트코드는 HLSLcc를 통해 GLSL로 부분적으로 변환될 수 있으며, ANGLE 및 HLSL2GLSL과 같이 GLSL을 HLSL로 변환하는 여러 도구가 존재한다.
* 중간 언어를 정의한다. SPIR-V는 부분적으로 이 목적을 위해 설계되었다. 이는 HLSL 또는 GLSL에서 생성될 수 있으며, HLSL, GLSL 또는 MSL로 역컴파일될 수 있다.

## 내용주
# OpenGL의 이전 정점 셰이딩 언어(순서는 무관)에는 EXT_vertex_shader, NV_vertex_program, 앞서 언급한 ARB_vertex_program, NV_vertex_program2 및 NV_vertex_program3가 있다.
# 프래그먼트 셰이딩의 경우 nvparse는 NV_register_combiners, 픽셀 계산을 위한 NV_register_combiners2 및 텍스처 조회를 위한 NV_texture_shader, NV_texture_shader2 및 NV_texture_shader3를 기반으로 한 고수준 추상화를 특징으로 하는 최초의 셰이딩 언어일 수 있다. ATI_fragment_shader는 "문자열 지향" 구문 분석 기능을 제공하지도 않았다(나중에 ATI_text_fragment_shader에 의해 추가되었지만). ARB_fragment_program은 매우 성공적이었다. NV_fragment_program 및 NV_fragment_program2는 실제로는 비슷하지만 후자는 다른 것들에 비해 훨씬 더 고급 기능을 제공한다.
# 엔비디아 홈페이지의 Fx 컴포저
#루디 코르테스 및 새티 라가바차리: The RenderMan Shading Language Guide, Course Technology PTR, 1 edition (2007년 12월 27일), 

## 각주

분류:프로그래밍 언어 분류
분류:셰이더 언어