셰이딩 언어

**셰이딩 언어**(Shading language)는 셰이더 효과 프로그래밍에 적용된 프로그래밍 언어이다. 셰이딩 언어는 일반적으로 "벡터", "행렬", "색상" 및 "법선"과 같은 특수한 자료형으로 구성된다.
# 오프라인 렌더링
오프라인 렌더링에 사용되는 셰이딩 언어는 자연어에 가까운 경향이 있어 프로그래밍에 대한 특별한 지식이 필요하지 않다. 오프라인 렌더링은 실시간 렌더링보다 더 많은 시간과 컴퓨팅 비용을 들여 최대 품질의 이미지를 생성하는 것을 목표로 한다.
## 렌더맨 셰이딩 언어
렌더맨 셰이딩 언어work=Pixar (줄여서 RSL 또는 SL)는 렌더맨 인터페이스 명세에 정의된 언어로, 프로덕션 품질 렌더링을 위한 일반적인 셰이딩 언어이다. 또한 구현된 최초의 셰이딩 언어 중 하나이다. 이 언어는 6가지 주요 셰이더 유형을 정의한다. * 광원 셰이더는 광원의 한 지점에서 대상 표면의 한 지점으로 방출되는 빛의 색상을 계산한다. * 표면 셰이더는 들어오는 빛과 물체의 물리적 속성을 기반으로 물체 표면의 점의 색상과 위치를 모델링한다. * 변위 셰이더는 색상과 독립적으로 표면 형상을 조작한다. * 변형 셰이더는 전체 공간을 변환한다. RenderMan 구현 중 AIR 렌더러는 이 셰이더 유형을 구현하여 공간에 적용되는 단일 선형 변환만 지원했다. * 볼륨 셰이더는 볼륨을 통과하는 빛의 색상을 조작한다. 이들은 안개와 같은 효과를 생성한다. * 이미저 셰이더는 최종 픽셀 값에 대한 색상 변환을 설명한다. 이는 이미지 필터와 유사하지만, 이미저 셰이더는 양자화 이전에 데이터에 작동한다. 이러한 데이터는 일반적인 출력 장치에 표시될 수 있는 것보다 더 넓은 동적 범위와 색상 해상도를 가진다.
## 후디니 VEX 셰이딩 언어
후디니 VEX(Vector Expressions) 셰이딩 언어(종종 "VEX"로 약칭됨)는 RenderMan을 면밀히 모델링했다. 그러나 완전한 3D 패키지에 통합되었다는 것은 셰이더 작성자가 셰이더 내부의 정보에 접근할 수 있음을 의미하며, 이는 렌더링 컨텍스트에서는 일반적으로 사용할 수 없는 기능이다. RSL과 VEX 간의 언어 차이는 주로 구문적이며, 여러 shadeop 이름의 차이도 있다.archivedate=22 July 2008
## 젤라토 셰이딩 언어
젤라토의year=2003–2008 셰이딩 언어는 후디니의 VEX처럼 RenderMan을 면밀히 모델링했다. 젤라토 셰이딩 언어와 RSL의 차이는 주로 구문적이다. 젤라토는 함수 정의에서 인수를 구분하기 위해 쉼표 대신 세미콜론을 사용하며 몇몇 shadeop의 이름과 매개변수가 다르다.
## 오픈 셰이딩 언어
오픈 셰이딩 언어(OSL)는 소니 픽처스 이미지워크스가 오토데스크 아널드 렌더러에서 사용하기 위해 개발했다. 또한 블렌더의 사이클 렌더 엔진에서도 사용된다. OSL의 표면 및 볼륨 셰이더는 표면 또는 볼륨이 빛을 어떻게 산란시키는지를 중요도 샘플링을 허용하는 방식으로 정의한다. 따라서 광선 추적 및 글로벌 일루미네이션을 지원하는 물리 기반 렌더러에 적합하다.
# 실시간 렌더링
실시간 렌더링을 위한 셰이딩 언어는 현재 널리 사용된다. 이들은 하드웨어 추상화를 높이고 이전 패러다임(변환 및 셰이딩 방정식을 하드코딩한)보다 더 유연한 프로그래밍 모델을 제공한다. 이들은 더 적은 오버헤드로 더 많은 제어와 풍부한 콘텐츠를 제공한다. GPU에서 직접 실행되도록 설계된 셰이더는 스트림 프로그래밍 모델 덕분에 높은 처리량의 일반 처리에서 유용해졌다. 이는 유사한 하드웨어에서 실행되는 컴퓨트 셰이더 개발로 이어졌다(참조: GPGPU). 역사적으로 몇몇 언어가 시장을 지배했으며, 아래에서 설명한다.
## ARB 어셈블리 언어
OpenGL 아키텍처 검토 위원회는 2002년에 ARB 어셈블리 언어를 프로그래밍 가능한 그래픽 프로세서를 위한 표준 저수준 명령어 집합으로 확립했다. 고수준 OpenGL 셰이딩 언어는 종종 로딩 및 실행을 위해 ARB 어셈블리로 컴파일된다. 고수준 셰이딩 언어와 달리 ARB 어셈블리는 제어 흐름이나 분기를 지원하지 않는다. 그러나 GPU 간 이식성이 필요할 때 계속 사용된다.
## OpenGL 셰이딩 언어
GLSL 또는 glslang으로도 알려진 이 표준화된url-status= 셰이딩 언어는 OpenGL과 함께 사용하기 위한 것이다. 이 언어는 정점 및 프래그먼트 처리를 단일 명령어 집합으로 통합하여 조건부 루프 및 분기를 허용한다. GLSL은 ARB 어셈블리 언어 이전에 있었다.
## Cg 프로그래밍 언어
엔비디아가 개발한 Cg 언어는 쉽고 효율적인 생산 파이프라인 통합을 위해 설계되었다.year=2012 이 언어는 API 독립성을 특징으로 하며 자산 관리를 개선하는 많은 무료 도구fxcomp와 함께 제공된다. Cg 개발은 2012년에 중단되었으며, 현재는 사용되지 않는 언어이다.
## DirectX 셰이더 어셈블리 언어
Direct3D 8 및 9의 셰이더 어셈블리 언어는 셰이더 모델 1.0/1.1, 2.0 및 3.0에서 정점 셰이더 및 픽셀 셰이더의 주요 프로그래밍 언어이다. 이는 그래픽 드라이버로 실행을 위해 전달되는 중간 셰이더 바이트코드의 직접적인 표현이다. 셰이더 어셈블리 언어는 통합 셰이더 모델 4.0, 4.1, 5.0 및 5.1을 직접 프로그래밍하는 데 사용할 수 없지만, 디버깅 목적으로 중간 바이트코드의 표현 기능을 유지한다.website=learn.microsoft.com
## 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 가속을 지원한다.pages=17–26pages=207–212 플래시 11.8에서 픽셀 벤더에 대한 GPU 가속이 제거되었다.publisher=scratch.mit.eduarchivedate=22 April 2014 AGAL은 저수준이지만 플랫폼 독립적인 셰이딩 언어로, 예를 들어 ARB 어셈블리 언어로 또는 GLSL로 컴파일될 수 있다.
## 플레이스테이션 셰이더 언어
소니그룹은 Cg/HLSL과 유사하지만 플레이스테이션 4에 특화된 셰이딩 언어로 플레이스테이션 셰이더 언어(PSSL)를 발표했다. PSSL은 DirectX 12의 HLSL 셰이더 언어와 대체로 호환되지만, PS4 및 PS5 플랫폼을 위한 추가 기능을 갖춘 것으로 알려져 있다.website=GDC Europe 2013
## 메탈 셰이딩 언어
애플은 2012년 이후에 출시된 대부분의 Mac과 5S 이후의 아이폰, 아이패드 에어 이후의 아이패드에서 실행되는 Metal이라는 저수준 그래픽스 API를 개발했다. Metal은 C++14 기반의 Metal Shading Language(MSL)라는 자체 셰이딩 언어를 가지고 있으며, 클랭과 LLVM을 사용하여 구현되었다. MSL은 정점, 프래그먼트 및 컴퓨트 처리를 통합한다.publisher=Apple
## WebGPU 셰이딩 언어
WebGPU 셰이딩 언어(WGSL)는 WebGPU를 위한 셰이더 언어이다. 즉, WebGPU API를 사용하는 애플리케이션은 WGSL을 사용하여 GPU에서 실행되는 셰이더로 알려진 프로그램을 표현한다.access-date=
# 번역
셰이더를 한 셰이딩 언어에서 다른 언어로 이식하기 위해 몇 가지 접근 방식이 사용된다.language=en-us * 공통 인터페이스를 정의한다. 예를 들어, 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로 역컴파일될 수 있다.archive-date=9 July 2022
# 내용주
#oldVtx OpenGL의 이전 정점 셰이딩 언어(순서는 무관)에는 EXT_vertex_shader, NV_vertex_program, 앞서 언급한 ARB_vertex_program, NV_vertex_program2 및 NV_vertex_program3가 있다. #oldFrag 프래그먼트 셰이딩의 경우 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는 실제로는 비슷하지만 후자는 다른 것들에 비해 훨씬 더 고급 기능을 제공한다. #fxcomp 엔비디아 홈페이지의 Fx 컴포저 #루디 코르테스 및 새티 라가바차리: The RenderMan Shading Language Guide, Course Technology PTR, 1 edition (2007년 12월 27일),