GLSL
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
GLSL(OpenGL Shading Language)은 OpenGL에서 그래픽 처리 장치(GPU)를 프로그래밍하기 위한 셰이딩 언어이다. 셰이더를 어셈블리 언어로 작성하는 복잡성을 해결하기 위해 개발되었으며, 정점 및 프래그먼트 셰이더를 사용하여 렌더링 파이프라인을 제어한다. GLSL은 크로스 플랫폼 호환성을 제공하며, OpenGL을 지원하는 모든 그래픽 카드에서 사용 가능하며, 각 하드웨어 공급업체가 특정 아키텍처에 최적화된 코드를 만들 수 있도록 드라이버에 컴파일러를 포함한다. GLSL은 OpenGL 2.0 코어에 공식적으로 포함되었으며, OpenGL ES 및 WebGL에서도 파생된 언어가 사용된다. GLSL은 C 언어와 유사한 문법을 가지며, 다양한 셰이더 단계와 데이터 형식을 지원하며, 컴파일 및 실행을 위해 OpenGL API를 사용한다. GLSL은 렌더링 알고리즘 커스터마이징과 재사용성을 높여 유연하고 고품질의 실시간 3D 그래픽을 구현하는 데 기여한다.
더 읽어볼만한 페이지
- 셰이더 언어 - Cg (프로그래밍 언어)
Cg는 엔비디아와 마이크로소프트가 GPU 프로그래밍을 위해 개발한 고수준 셰이딩 언어로, GLSL, HLSL과 유사하며 CUDA 환경에도 영향을 미쳤고 현재도 활용되고 있다. - 셰이더 언어 - 고급 셰이더 언어
고급 셰이더 언어(HLSL)는 마이크로소프트에서 개발한 셰이딩 언어로, Direct3D API와 함께 GPU에서 실행되는 셰이더 프로그램을 작성하는 데 사용되며, C/C++와 유사한 구문을 가지고 다양한 셰이더 모델을 지원하여 3차원 그래픽 렌더링을 커스터마이즈하고 실시간 레이 트레이싱과 같은 최신 그래픽 기술을 구현하는 데 중요한 역할을 한다. - C 프로그래밍 언어 계열 - C (프로그래밍 언어)
C는 하드웨어 제어와 이식성이 뛰어난 고급 절차적 프로그래밍 언어로서, 다양한 분야에서 사용되며 후속 언어에 영향을 주었고, 성능과 효율성이 높지만 안전성 문제 개선이 필요한 언어이다. - C 프로그래밍 언어 계열 - 펄
펄은 래리 월이 개발한 텍스트 조작에 강점을 가진 다목적 프로그래밍 언어이며, 1987년 펄 1.0이 처음 공개된 이후 여러 버전 업데이트를 거쳐 객체 지향 프로그래밍과 유니코드 지원 기능을 추가했고, 현재 펄 5가 널리 사용되며 CPAN을 통해 방대한 모듈 생태계를 제공한다. - 그래픽 라이브러리 - Direct2D
Direct2D는 마이크로소프트에서 개발한 2D 그래픽 API로, 낮은 수준의 추상화, 고품질 텍스트 렌더링, 안티앨리어싱, 하드웨어 가속, 높은 DPI 지원 등의 특징을 가지며 다양한 분야에서 활용된다. - 그래픽 라이브러리 - WinG
WinG는 윈도우 3.x의 그래픽 성능 향상을 위해 개발된 기술로, DirectX로 발전하는 기반이 되었으며 한국 게임 산업에도 영향을 미쳤다.
| GLSL - [IT 관련 정보]에 관한 문서 | |
|---|---|
| 일반 정보 | |
![]() | |
| 종류 | 쉐이딩 언어 |
| 패러다임 | 명령형 프로그래밍 |
| 설계자 | OpenGL Architecture Review Board (ARB) |
| 개발자 | 크로노스 그룹 |
| 최초 출시 | (정보 없음, 문서 내 명시되지 않음) |
| 최신 버전 | 4.6 |
| 최신 버전 출시일 | 2017년 7월 31일 |
| 정적 타이핑 | 정적 타이핑 |
| 구현체 | glslangValidator glslc |
| 영향을 받은 언어 | C 언어 C++ |
| 영향을 준 언어 | Core Image Kernel Language Android Graphics Shading Language (AGSL) |
| 플랫폼 | 크로스 플랫폼 |
| 파일 확장자 | glsl vert frag geom tesc tese comp |
| 웹사이트 | OpenGL 공식 웹사이트 |
2. 역사적 배경
그래픽 카드 기술의 발전과 함께 정점 및 프래그먼트 수준의 렌더링 파이프라인에서 유연성을 높이기 위해 새로운 기능이 추가되었다. 이러한 수준에서의 프로그래밍은 프래그먼트 및 정점 셰이더를 사용하여 구현된다.
원래, 이 기능은 복잡하고 직관적이지 않은 작업인 ARB 어셈블리 언어로 셰이더를 작성하여 구현되었다. OpenGL ARB는 OpenGL의 역사를 통틀어 OpenGL을 이끌어온 개방형 표준의 이점을 유지하면서 그래픽 처리 장치를 프로그래밍하는 더 직관적인 방법을 제공하기 위해 OpenGL 셰이딩 언어를 만들었다.
원래 OpenGL 1.4의 확장 기능으로 도입된 GLSL은 2004년 OpenGL ARB에 의해 OpenGL 2.0 코어에 공식적으로 포함되었다. 이는 1992년 OpenGL 1.0이 만들어진 이후 OpenGL의 첫 번째 주요 개정판이었다.
GLSL을 사용하면 다음과 같은 이점이 있다.
- Linux, macOS, Windows를 포함한 여러 운영 체제에서 크로스 플랫폼 호환성.
- OpenGL 셰이딩 언어를 지원하는 모든 하드웨어 공급업체의 그래픽 카드에서 사용할 수 있는 셰이더를 작성하는 기능.
- 각 하드웨어 공급업체는 드라이버에 GLSL 컴파일러를 포함하므로 각 공급업체는 특정 그래픽 카드의 아키텍처에 최적화된 코드를 만들 수 있다.
Direct3D 7까지의 시대, 즉 1990년대까지의 실시간 3D 컴퓨터 그래픽스는 OpenGL이나 Direct3D와 같은 API를 통해 그래픽 카드상의 칩(GPU)에 미리 준비된 고정 렌더링 파이프라인에서 고정 기능의 셰이더(정점 변환 및 음영 계산을 전문으로 담당하는 유닛)를 조합하여 실현되었다. Direct3D 8이 등장한 2000년 이후에는 GPU의 진화·성능 향상에 따라 새로운 기능은 하드웨어 구현에 의한 고정 기능이 아닌, 애플리케이션 개발자가 소프트웨어 프로그램(프로그래밍 가능 셰이더)으로 정점 레벨·프래그먼트 레벨(픽셀 레벨)에서 제어·커스터마이징을 수행하여 렌더링 파이프라인 내에서의 유연성 및 표현력을 증가시킬 수 있는 형태로 추가되는 경우가 많아지고 있다.
원래, 이 프로그래밍 가능 셰이딩 기능은 복잡하고 직관적이지 않은 어셈블리 언어로 작성된 셰이더를 사용하지 않으면 실현할 수 없었다. OpenGL ARB는 OpenGL을 그래픽스 산업 역사상 오픈 스탠다드로 만들어가는 과정에서 그래픽스 처리를 보다 직관적이고 효율적으로 할 수 있는 방법으로 OpenGL Shading Language를 만들었다.
OpenGL Shading Language는 2003년에 발표된 OpenGL 1.5의 확장 기능으로 도입되었지만[30], OpenGL ARB는 OpenGL 2.0에 GLSL을 포함하는 것을 공식적으로 결정했다. OpenGL 2.0은 1992년에 발표된 OpenGL 1.0에서 처음으로 메이저 버전 업그레이드를 했다.
초기의 OpenGL 프로그래밍 가능 셰이더는 정점 단위의 변환 및 음영 계산을 수행하는 '''버텍스 셰이더''' (vertex shader) 와 프래그먼트(픽셀) 단위의 음영 계산을 수행하는 '''프래그먼트 셰이더''' (fragment shader) 만 이용 가능했다. 이후 프리미티브[31]의 증감이나 변경 등을 실행할 수 있는 '''지오메트리 셰이더''' (geometry shader) 가 OpenGL 3.2/GLSL 1.5에서 표준화되었다. 또한 OpenGL 4.0에서 고정 기능 셰이더인 테셀레이션 스테이지가 추가됨에 따라, '''테셀레이션 컨트롤 셰이더''' (tessellation control shader) 와 '''테셀레이션 평가 셰이더''' (tessellation evaluation shader), 이 두 가지 프로그래밍 가능한 셰이더가 GLSL의 사양에 추가되었다. 프래그먼트 셰이더도 샘플 레벨에서 제어가 가능하게 되었다.
한편, OpenGL과 유사한 3D 그래픽스 API인 DirectX (Direct3D) 및 해당 셰이딩 언어인 HLSL에는 버전 11 이후 GPU에서 범용적인 컴퓨팅(GPGPU)을 가능하게 하는 DirectX Compute Shader(DirectCompute)가 추가되었지만, OpenGL 및 GLSL의 버전 4.0 시점에서는 이에 해당하는 셰이더는 포함되어 있지 않았다. 그러나 버전 4.3에서 OpenGL '''컴퓨트 셰이더''' (compute shader) 로 동일한 기능이 도입되었다. 또한, 컴퓨트 셰이더의 도입 이전부터 OpenGL의 관할을 수행하고 있는 크로노스가 마찬가지로 오픈 사양으로 책정하고 있는, GPU를 범용 컴퓨팅에 사용할 수 있는 API로 OpenCL이 존재하지만, 이쪽은 CPU나 GPU 등 모든 계산 자원을 계산에 사용할 수 있는 이종 계산 자원 혼재(헤테로지니어스) 환경을 위한 API이며, 그래픽스 파이프라인과의 연계를 주 목적으로 하는 컴퓨트 셰이더와는 특기가 약간 다르다.
GLSL을 사용하는 장점으로,
- 렌더링 알고리즘의 유연한 커스터마이징과 재사용성이 증가하여, 기존의 하드웨어 고정 기능에 얽매이지 않는 유연하고 독특하며 고품질의 실시간 3DCG 장면을 구축할 수 있다.
- Macintosh나 Windows, Linux를 포함한 여러 OS 간의 호환성을 확보할 수 있다.
- 어셈블리 언어를 사용하는 것보다 코드의 재사용성 및 유지보수성이 증가한다.
- OpenGL Shading Language를 지원하는 어떤 하드웨어 벤더의 GPU에서도 작동하는 셰이더를 작성할 수 있는 능력을 가진다.
- 각 하드웨어 벤더는 장치 드라이버 내에 GLSL 컴파일러를 포함할 수 있으므로, 해당 GPU의 아키텍처에 최적화된 코드를 생성할 수 있다.
등을 들 수 있다. 기존의 고정 기능 셰이더에 대한 단점으로는,
- 셰이더의 컴파일 및 어태치 등, 렌더링을 위한 준비 작업이 증가한다.
- OpenGL API 외에 GLSL의 학습 비용이 든다.
- GPU 특성 및 하드웨어 사양을 파악하여 GLSL 코드를 작성할 필요가 있으며, CPU와 비교하여 튜닝이 어렵다.
등을 들 수 있다.
한편, GLSL의 파생 규격으로 내장 환경용 OpenGL ES용 셰이더 언어 "GLSL ES"가 존재한다. 이는 ESSL이라고 불리기도 한다[32]。
웹 브라우저용 OpenGL ES 파생 규격으로 WebGL이 존재하지만, WebGL에서도 GLSL이 사용된다.
크로노스가 책정하고 있는 로우 레벨 그래픽스 API인 Vulkan은 셰이더 프로그램의 중간 표현 SPIR-V를 입력으로 받지만, SPIR-V를 출력하는 오프라인 셰이더 컴파일러 '''glslangValidator'''에서 처음 지원된 상위 레벨 셰이딩 언어는 GLSL이다. 나중에 SPIR-V는 OpenGL 4.6에도 도입되었다.
2. 1. OpenGL과의 관계
GLSL은 OpenGL ARB가 그래픽 처리 장치를 프로그래밍하는 더 직관적인 방법을 제공하기 위해 만들어졌으며, OpenGL의 역사와 함께 발전해왔다.[1] 원래 ARB 어셈블리 언어로 셰이더를 작성하는 것은 복잡하고 직관적이지 않은 작업이었다.[1] GLSL은 Linux, macOS, Windows를 포함한 여러 운영 체제에서 크로스 플랫폼 호환성을 제공하며, OpenGL 셰이딩 언어를 지원하는 모든 하드웨어 공급업체의 그래픽 카드에서 사용할 수 있는 셰이더를 작성할 수 있게 해준다.[1] 각 하드웨어 공급업체는 드라이버에 GLSL 컴파일러를 포함하므로, 각 공급업체는 특정 그래픽 카드의 아키텍처에 최적화된 코드를 생성할 수 있다.[1]GLSL은 2004년 OpenGL 2.0 코어에 공식적으로 포함되었으며, 이는 1992년 OpenGL 1.0이 만들어진 이후 OpenGL의 첫 번째 주요 개정판이었다.[1] GLSL 버전은 특정 OpenGL API 버전과 함께 진화해 왔으며, OpenGL 버전 3.3 이상부터는 GLSL과 OpenGL의 주 버전 및 부 버전 번호가 일치한다.[1]
OpenGL ES 및 WebGL은 '''OpenGL ES 셰이딩 언어''' (약어: '''GLSL ES''' 또는 '''ESSL''')를 사용하며, GLSL과 관련이 있지만 직접 호환되지는 않는다. 표준 휴대용 중간 표현 (SPIRV-Cross)을 통해 상호 변환할 수 있다.[18]
2. 2. OpenGL ES 및 WebGL
OpenGL ES 및 WebGL은 '''OpenGL ES 셰이딩 언어''' (약어: '''GLSL ES''' 또는 '''ESSL''')를 사용한다.[14][15][16][17] GLSL ES는 OpenGL ES 및 WebGL의 버전과 함께 발전해왔다. 두 언어는 관련이 있지만 직접 호환되지는 않으며, 표준 휴대용 중간 표현 (SPIRV-Cross)을 통해 상호 변환할 수 있다.[18]
2. 3. Direct3D 와의 관계
마이크로소프트의 Direct3D에서 사용하는 HLSL과는 경쟁 관계에 있지만, 서로 영향을 주고받으며 발전하고 있다. 특히 Vulkan의 등장으로 인해, GLSL과 HLSL 모두 SPIR-V라는 중간 언어를 공통적으로 사용할 수 있게 되면서, 상호 운용성이 증대되고 있다.3. 특징
GLSL은 다음과 같은 특징을 갖는다.
- 매킨토시나 윈도우, 리눅스 등의 여러 운영 체제 간의 호환성을 지원한다.
- GLSL을 지원하는 어떠한 제조사의 그래픽 카드에서도 동작하는 셰이더를 쓸 수 있다.
- 하드웨어 제조사는 그래픽 카드 장치 드라이버 내에 GLSL 컴파일러를 포함할 수 있도록 지원한다. 이 덕분에, 그 그래픽 카드의 마이크로아키텍처에 최적화된 코드를 만들 수 있다.
3. 1. 플랫폼 간 호환성
GLSL은 매킨토시나 윈도우, 리눅스 등의 여러 운영 체제 간의 호환성을 지원한다. GLSL을 지원하는 어떠한 제조사의 그래픽 카드에서도 동작하는 셰이더를 쓸 수 있다. 하드웨어 제조사는 그래픽 카드 장치 드라이버 내에 GLSL 컴파일러를 포함할 수 있도록 지원하며, 이를 통해 해당 그래픽 카드의 마이크로아키텍처에 최적화된 코드를 만들 수 있다.3. 2. 하드웨어 지원
GLSL은 매킨토시, 윈도우, 리눅스 등 여러 운영 체제 간의 호환성을 지원한다. GLSL을 지원하는 모든 그래픽 카드에서 셰이더를 사용할 수 있다. 각 그래픽 카드 제조사는 드라이버에 GLSL 컴파일러를 포함하여, 해당 그래픽 카드에 최적화된 코드를 생성할 수 있다.3. 3. C언어 기반
GLSL은 C 언어와 매우 유사한 문법을 가지고 있어, C/C++ 개발자에게 친숙하다. 포인터를 제외한 C/C++ 연산자를 대부분 지원한다. 비트 연산자는 버전 1.30에 추가되었다.3. 4. 그래픽스 특화 기능
GLSL은 매킨토시나 윈도우, 리눅스 등의 여러 운영 체제 간의 호환성을 지원한다. GLSL을 지원하는 어떠한 제조사의 그래픽 카드에서도 동작하는 셰이더를 쓸 수 있다. 하드웨어 제조사는 그래픽 카드 장치 드라이버 내에 GLSL 컴파일러를 포함할 수 있도록 지원하며, 이를 통해 해당 그래픽 카드의 마이크로아키텍처에 최적화된 코드를 생성할 수 있다.4. 언어 구성
4. 1. 데이터 형
OpenGL 셰이딩 언어(GLSL) 1.50 사양에서는 64개의 기본 데이터 형식을 정의한다.[33] C 언어에서 사용되는 것과 동일한 데이터 형식도 있지만, 그래픽스 처리에 특화된 형식도 있다.[33]- `void`: 값을 반환하지 않는 함수에 사용된다.
- `bool`: 조건형으로, `true` 또는 `false` 값을 가진다.
- `int`: 부호 있는 32비트 정수이다.
- `float`: 단정밀도 부동 소수점 수이다.
- `vec2`, `vec3`, `vec4`: 각각 2, 3, 4개의 요소를 갖는 단정밀도 부동 소수점 벡터이다.
- `bvec2`, `bvec3`, `bvec4`: 각각 2, 3, 4개의 요소를 갖는 논리형 벡터이다.
- `ivec2`, `ivec3`, `ivec4`: 각각 2, 3, 4개의 요소를 갖는 부호 있는 32비트 정수 벡터이다.
- `mat2`, `mat3`, `mat4`: 각각 2x2, 3x3, 4x4 요소를 갖는 단정밀도 부동 소수점 행렬이다.
- `sampler1D`, `sampler2D`, `sampler3D`: 각각 1차원, 2차원, 3차원 텍스처에 접근하기 위한 핸들이다.
- `samplerCube`: 큐브 맵 텍스처에 접근하기 위한 핸들이다.
- `sampler1DShadow`, `sampler2DShadow`: 각각 1차원, 2차원 깊이 텍스처에 접근하기 위한 핸들이다.
부호 없는 32비트 정수 지원은 OpenGL 3.0 (GLSL 1.3)에서 표준화되었고, 과학 계산 등 분야에서 필요한 경우가 많은 배정밀도 부동 소수점 수 지원은 OpenGL 4.0 (GLSL 4.0)에서 표준화되었다.
4. 2. 연산자
GLSL은 C 언어와 C++의 연산자를 대부분 포함하며, 포인터는 예외이다. 비트 연산자는 버전 1.30에 추가되었다. 벡터 연산에 특화된 연산자(예: 튜플을 반환하는 스위즐 연산)도 제공하여 셰이더를 유연하고 효율적으로 작성할 수 있도록 돕는다.4. 3. 함수 및 제어 구조
GLSL은 C 프로그래밍 언어와 유사하게 if-else, for, switch 등과 같은 루프와 분기를 지원한다. 재귀는 금지되며 컴파일 중에 확인된다.사용자 정의 함수가 지원되며 내장 함수가 제공된다. 그래픽 카드 제조업체는 하드웨어 수준에서 내장 함수를 최적화할 수 있다. 이러한 함수 중 다수는 C 프로그래밍 언어의 수학 라이브러리에 있는 함수와 유사하며, 다른 함수는 그래픽 프로그래밍에 특화되어 있다. 대부분의 내장 함수와 연산자는 스칼라와 벡터(최대 4개의 요소) 모두에서 하나 또는 두 개의 피연산자에 대해 작동할 수 있다. 그래픽 목적에 일반적으로 사용되는 일반적인 내장 함수는 mix, smoothstep, normalize, inversesqrt, clamp, length, distance, dot, cross, reflect, refract 및 벡터 min 및 max이다. abs, sin, pow 등과 같은 다른 함수가 제공되지만, 이들은 모두 벡터 수량, 즉 pow(vec3(1.5, 2.0, 2.5), abs(vec3(0.1, -0.2, 0.3)))에서도 작동할 수 있다. GLSL은 함수 오버로딩 (내장 함수와 연산자 및 사용자 정의 함수 모두에 대해)을 지원하므로 매개변수 수 또는 매개변수 유형이 다른 여러 함수 정의가 동일한 이름을 가질 수 있다. 각각은 자체적으로 독립적인 반환 유형을 가질 수 있다.
GLSL은 C 언어에서 볼 수 있는 if/else if/else, for, while, do-while, break, continue 등의 반복이나 분기와 같은 제어문도 지원한다.
몇 가지 내장 함수 외에도 사용자 정의 함수도 지원한다. GPU 벤더는 필요에 따라 내장 함수의 구현을 하드웨어 레벨에서 최적화할 수도 있다. 내장 함수의 대부분은 exp()나 abs()와 같은 C 언어의 표준 라이브러리에서 볼 수 있는 것과 매우 유사하지만, 한편으로는 smoothstep()나 texture2D()와 같이 그래픽스 프로그래밍에 특화된 것도 있다.
4. 4. 변수
GLSL 코드 내에서 변수의 선언 및 사용 방법은 C 언어와 유사하다.변수의 한정자는 4가지가 있다(이하 버텍스 셰이더, 지오메트리 셰이더, 프래그먼트 셰이더를 각각 VS, GS, FS로 나타낸다).
- `const`: 변경되지 않음.
- `uniform`: 모든 셰이더에서 사용 가능한 전역 읽기 전용 변수.
- `in`: 입력 변수. VS에서는 OpenGL에서 전달되는 정점 정보 세트를 나타낸다(구 `attribute`). GS에서는 VS에 의해 계산된 정점 정보 세트, FS에서는 VS 또는 GS에 의해 계산된 정점 정보가 보간된 값을 나타낸다(구 `varying`).
- `out`: 출력 변수. VS에서는 GS 또는 FS로(구 `varying`), GS에서는 FS로 전달하는 정점 정보 세트를 나타낸다. FS에서는 최종적으로 픽셀 단위로 출력하는 색상 정보를 나타낸다.
- `inout`: 입출력 변수.
4. 5. 셰이더 단계
GLSL은 다양한 셰이더 단계를 지원한다. OpenGL 4.3 (GLSL 4.3) 이후, OpenGL ES 3.2 (GLSL ES 3.2) 이후, 그리고 Vulkan 1.0 이후에서는 다음과 같은 6가지 종류의 셰이더 스테이지를 지원한다.- 정점 셰이더
- 테셀레이션 제어 셰이더: GLSL 4.0 / GLSL ES 3.2에서 지원
- 테셀레이션 평가 셰이더: GLSL 4.0 / GLSL ES 3.2에서 지원
- 지오메트리 셰이더: GLSL 1.5 / GLSL ES 3.2에서 지원
- 프래그먼트 셰이더
- 컴퓨트 셰이더: GLSL 4.3 / GLSL ES 3.1에서 지원
5. 컴파일 및 실행
GLSL 셰이더는 독립 실행형 애플리케이션이 아니며, 리눅스, macOS, 윈도우 등 다양한 플랫폼에서 사용할 수 있는 OpenGL API를 사용하는 애플리케이션이 필요하다. C, C++, C#, 자바스크립트, 델파이, 자바 등 다양한 언어 바인딩이 존재한다.
GLSL 셰이더 자체는 OpenGL API의 진입점을 사용하여 애플리케이션 내에서 컴파일을 위해 하드웨어 공급업체의 드라이버에 전달되는 문자열 집합이다. 셰이더는 애플리케이션 내에서 즉석에서 생성하거나 텍스트 파일로 읽어 들일 수 있지만, 문자열 형태로 드라이버로 전송해야 한다.
기존 방식에서는 GLSL 셰이더는 OpenGL API 함수를 통해 하드웨어 벤더가 구현한 장치 드라이버 상의 온라인 컴파일러에 의해 실행 시 컴파일된다. GLSL 셰이더 프로그램의 소스 코드는 호스트 프로그램 상의 문자열 리터럴로 작성되거나, 애플리케이션 실행 시 외부 텍스트 파일 등에서 읽어들여 메모리 상의 문자열 데이터로 실체화되지만, 오프라인 사전 컴파일 방식이 아닌, 어디까지나 드라이버에 소스 코드 문자열 형식으로 전달되어 드라이버가 실행 시 셰이더의 소스 코드를 컴파일하여 "셰이더 프로그램 객체"를 생성한다. 구체적인 절차로, 애플리케이션은 먼저 `glCreateShader()`로 각 셰이더 스테이지의 셰이더 객체를 생성하고, 해당 셰이더 객체에 GLSL 소스 코드 문자열을 `glShaderSource()`로 설정한 후, `glCompileShader()`를 사용하여 셰이더를 컴파일한다. 그 후, `glCreateProgram()`으로 생성한 프로그램 객체에 `glAttachShader()`로 전술한 컴파일된 셰이더 객체를 연결하고, `glLinkProgram()`로 링크함으로써 비로소 일련의 프로그래밍 가능한 셰이더 파이프라인이 완성된다. 셰이더 프로그램을 사용하여 그리려면, 그리기 명령을 발행하기 전에 `glUseProgram()`으로 현재 OpenGL 컨텍스트에 프로그램 객체를 바인딩해 둘 필요가 있다.
GLSL 프로그램을 컴파일, 링크하고 매개변수를 전달하는 데 사용되는 API 집합은 세 가지 OpenGL 확장 기능으로 지정되었으며, OpenGL 버전 2.0부터 핵심 OpenGL의 일부가 되었다. OpenGL 3.2에서는 지오메트리 셰이더, OpenGL 4.0에서는 테셀레이션 셰이더, OpenGL 4.3에서는 컴퓨트 셰이더로 API가 확장되었다. 이러한 OpenGL API는 다음 확장 기능에서 찾을 수 있다.
- ARB 버텍스 셰이더
- ARB 프래그먼트 셰이더
- ARB 셰이더 객체
- ARB 지오메트리 셰이더 4
- ARB 테셀레이션 셰이더
- ARB 컴퓨트 셰이더
셰이더 프로그램의 컴파일 및 링크는 시간이 걸리는 처리이므로, 애플리케이션 초기화의 병목 현상이 될 수 있다. 최근 소스 코드 문자열에 대응하는 컴파일 결과는 드라이버 측에서 캐시되는 구현으로 되어 있는 경우도 많다. OpenGL 4.1에서 표준화된 GL_ARB_get_program_binary에 의해, 컴파일된 바이너리의 직렬화 및 역직렬화가 확장으로 지원되게 되었지만, 바이너리가 벤더 간 호환성이 있는 중간 형식인지 여부는 보장되지 않는다. OpenGL 4.5에서 표준화된 GL_ARB_parallel_shader_compile에 의해, 멀티스레드를 이용한 셰이더의 병렬 컴파일이 확장으로 지원되게 되었다. 장치 드라이버가 GLSL 컴파일러를 내장하고 있기 때문에, 드라이버에 따라 셰이더 프로그램의 컴파일 결과나 실행 결과가 달라질 수 있는 등 품질 문제도 안고 있다.
OpenGL 4.6에서는 중간 표현 SPIR-V가 지원되게 되어, 오프라인 컴파일이 가능하게 되었다.
5. 1. 컴파일 과정
GLSL 셰이더는 독립 실행형 애플리케이션이 아니며, 리눅스, macOS, 윈도우 등 다양한 플랫폼에서 사용할 수 있는 OpenGL API를 사용하는 애플리케이션이 필요하다. C, C++, C#, 자바스크립트, 델파이, 자바 등 다양한 언어 바인딩이 존재한다.GLSL 셰이더는 OpenGL API 함수를 통해 하드웨어 공급업체의 드라이버에 전달되는 문자열 집합이다. 셰이더는 애플리케이션 내에서 즉석에서 생성하거나 텍스트 파일로 읽어 들일 수 있지만, 문자열 형태로 드라이버로 전송해야 한다.
기존 방식에서는 GLSL 셰이더는 OpenGL API 함수를 통해 하드웨어 벤더가 구현한 장치 드라이버 상의 온라인 컴파일러에 의해 실행 시 컴파일된다. GLSL 셰이더 프로그램의 소스 코드는 호스트 프로그램 상의 문자열 리터럴로 작성되거나, 애플리케이션 실행 시 외부 텍스트 파일 등에서 읽어들여 메모리 상의 문자열 데이터로 실체화되지만, 오프라인 사전 컴파일 방식이 아닌, 어디까지나 드라이버에 소스 코드 문자열 형식으로 전달되어 드라이버가 실행 시 셰이더의 소스 코드를 컴파일하여 "셰이더 프로그램 객체"를 생성한다. 구체적인 절차로, 애플리케이션은 먼저 `glCreateShader()`로 각 셰이더 스테이지의 셰이더 객체를 생성하고, 해당 셰이더 객체에 GLSL 소스 코드 문자열을 `glShaderSource()`로 설정한 후, `glCompileShader()`를 사용하여 셰이더를 컴파일한다. 그 후, `glCreateProgram()`으로 생성한 프로그램 객체에 `glAttachShader()`로 전술한 컴파일된 셰이더 객체를 연결하고, `glLinkProgram()`로 링크함으로써 비로소 일련의 프로그래밍 가능한 셰이더 파이프라인이 완성된다. 셰이더 프로그램을 사용하여 그리려면, 그리기 명령을 발행하기 전에 `glUseProgram()`으로 현재 OpenGL 컨텍스트에 프로그램 객체를 바인딩해 둘 필요가 있다.
셰이더 프로그램의 컴파일 및 링크는 시간이 걸리는 처리이므로, 애플리케이션 초기화의 병목 현상이 될 수 있다. OpenGL 4.1에서 표준화된 GL_ARB_get_program_binary에 의해, 컴파일된 바이너리의 직렬화 및 역직렬화가 확장으로 지원되게 되었지만, 바이너리가 벤더 간 호환성이 있는 중간 형식인지 여부는 보장되지 않는다. OpenGL 4.5에서 표준화된 GL_ARB_parallel_shader_compile에 의해, 멀티스레드를 이용한 셰이더의 병렬 컴파일이 확장으로 지원되게 되었다. 장치 드라이버가 GLSL 컴파일러를 내장하고 있기 때문에, 드라이버에 따라 셰이더 프로그램의 컴파일 결과나 실행 결과가 달라질 수 있는 등 품질 문제도 안고 있다.
5. 2. 실행 과정
GLSL 셰이더는 독립 실행형 애플리케이션이 아니며, 리눅스, macOS, 윈도우 등 다양한 플랫폼에서 사용할 수 있는 OpenGL API를 사용하는 애플리케이션이 필요하다. C, C++, C#, 자바스크립트, 델파이, 자바 등 다양한 언어 바인딩이 존재한다.GLSL 셰이더 자체는 OpenGL API의 진입점을 사용하여 애플리케이션 내에서 컴파일을 위해 하드웨어 공급업체의 드라이버에 전달되는 문자열 집합이다. 셰이더는 애플리케이션 내에서 즉석에서 생성하거나 텍스트 파일로 읽어 들일 수 있지만 문자열 형태로 드라이버로 전송해야 한다.
GLSL 프로그램을 컴파일, 링크하고 매개변수를 전달하는 데 사용되는 API 집합은 세 가지 OpenGL 확장 기능으로 지정되었으며, OpenGL 버전 2.0부터 핵심 OpenGL의 일부가 되었다. OpenGL 3.2에서는 지오메트리 셰이더, OpenGL 4.0에서는 테셀레이션 셰이더, OpenGL 4.3에서는 컴퓨트 셰이더로 API가 확장되었다. 이러한 OpenGL API는 다음 확장 기능에서 찾을 수 있다.
- ARB 버텍스 셰이더
- ARB 프래그먼트 셰이더
- ARB 셰이더 객체
- ARB 지오메트리 셰이더 4
- ARB 테셀레이션 셰이더
- ARB 컴퓨트 셰이더
기존 방식에서는 GLSL 셰이더는 OpenGL API 함수를 통해 하드웨어 벤더가 구현한 장치 드라이버 상의 온라인 컴파일러에 의해 실행 시 컴파일된다. 셰이더 프로그램 객체는
glCreateShader(), glShaderSource(), glCompileShader(), glAttachShader(), glLinkProgram() 함수들을 사용하여 생성하고 컴파일 및 링크한다. 셰이더 프로그램을 사용하려면, 그리기 명령을 발행하기 전에 `glUseProgram()` 함수를 사용하여 현재 OpenGL 컨텍스트에 프로그램 객체를 바인딩해야 한다.셰이더 프로그램의 컴파일 및 링크는 시간이 걸리는 처리이므로, 애플리케이션 초기화의 병목 현상이 될 수 있다. 최근 소스 코드 문자열에 대응하는 컴파일 결과는 드라이버 측에서 캐시되는 구현으로 되어 있는 경우도 많다. OpenGL 4.1의 GL_ARB_get_program_binary 확장, OpenGL 4.5의 GL_ARB_parallel_shader_compile 확장을 통해 바이너리 직렬화/역직렬화 및 병렬 컴파일이 지원된다.
OpenGL 4.6에서는 중간 표현 SPIR-V가 지원되게 되어, 오프라인 컴파일이 가능하게 되었다.
5. 3. 컴파일 및 링크의 최적화
GLSL 셰이더는 독립 실행형 애플리케이션이 아니며, 다양한 플랫폼에서 OpenGL API를 사용하는 애플리케이션이 필요하다. 셰이더는 애플리케이션 내에서 즉석에서 생성되거나 텍스트 파일로 읽어 들일 수 있지만, 문자열 형태로 드라이버에 전송되어야 한다.GLSL 셰이더 프로그램은 OpenGL API 함수를 통해 하드웨어 벤더가 구현한 장치 드라이버 상의 온라인 컴파일러에 의해 런타임에 컴파일된다. 셰이더 프로그램의 컴파일 및 링크는 시간이 걸리는 처리이므로, 드라이버는 컴파일 결과를 캐싱하여 성능을 향상시키는 경우가 많다. OpenGL 4.1부터는 컴파일된 바이너리의 직렬화 및 역직렬화를 지원하며, OpenGL 4.5부터는 멀티스레드를 이용한 셰이더의 병렬 컴파일을 지원한다. OpenGL 4.6에서는 중간 표현 SPIR-V를 지원하여 오프라인 컴파일이 가능해졌다.
6. 버전
GLSL 버전은 OpenGL API의 특정 버전과 함께 진화해왔다. GLSL과 OpenGL 메이저, 마이너 버전이 매칭되는 OpenGL 버전 3.3 이상에서만 지원된다.[1][6][35][40]
OpenGL ES과 WebGL은 '''OpenGL ES Shading Language'''(약어: '''GLSL ES''' 또는 '''ESSL''')를 사용한다.[48] GLSL ES는 GLSL을 기반으로 하며, 두 언어는 관련이 있지만 직접 호환되지는 않는다. 표준 휴대용 중간 표현 (SPIRV-Cross)을 통해 상호 변환할 수 있다.[18]
6. 1. 버전 표
GLSL 버전은 OpenGL API의 특정 버전과 함께 진화해왔다. GLSL과 OpenGL 메이저, 마이너 버전이 매칭되는 OpenGL 버전 3.3 이상에서만 지원된다.[1][6][35][40]
OpenGL ES과 WebGL은 '''OpenGL ES Shading Language'''(약어: '''GLSL ES''' 또는 '''ESSL''')를 사용한다.[48] GLSL ES는 GLSL을 기반으로 하며, 두 언어는 관련이 있지만 직접 호환되지는 않는다. 표준 휴대용 중간 표현 (SPIRV-Cross)을 통해 상호 변환할 수 있다.[18]
7. 예제
7. 1. 버텍스 셰이더 예제
다음은 고정 기능 파이프라인과 마찬가지로 입력 정점을 변환하는 예제이다.```glsl
void main (void)
{
gl_Position = ftransform ();
}
```
`ftransform()`는 GLSL 1.40 및 GLSL ES 1.0부터 지원되지 않는다. 대신, 프로그래머는 새로운 OpenGL 3.1 표준에 따라 모델 뷰 행렬 및 투영 행렬을 명시적으로 지정해야 한다.
```glsl
# version 140
uniform mat4 projectionMatrix;
uniform mat4 modelviewMatrix;
in vec3 position;
void main (void)
{
gl_Position = projectionMatrix * modelviewMatrix * vec4 (position, 1.0);
}
```
이는 고정 기능 파이프라인과 유사하게 입력 정점을 변환한다.
7. 2. 지오메트리 셰이더 예제
glsllayout (triangles) in;
layout (triangle_strip, max_vertices = 3) out;
in Input
{
vec4 Position;
} VSout [3];
void main (void)
{
for (int i = 0; i <3; i + +)
{
gl_Position = VSout [i]. Position;
EmitVertex ();
}
EndPrimitive ();
}
```
```glsl
layout(triangles) in;
layout(triangle_strip, max_vertices = 3) out;
in Input
{
vec4 Position;
} VSout[3];
void main(void)
{
for(int i = 0; i < 3; i++)
{
gl_Position = VSout[i].Position;
EmitVertex();
}
EndPrimitive();
}
7. 3. 프래그먼트 셰이더 예제
glslvoid main (void)
{
gl_FragColor = vec4 (1.0, 0.0, 0.0, 1.0);
}
```
```glsl
void main(void)
{
gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); // 빨강.
}
8. 개발 도구
GLSL 셰이더는 단독으로 작동하는 프로그램이 아니다. 셰이더 프로그램을 GPU에서 실행하려면 먼저 C/C++ 등으로 작성된 호스트 애플리케이션에 입력해야 한다. 구체적으로 OpenGL API를 사용하여 셰이더 프로그램을 컴파일 및 링크한 후, OpenGL 렌더링 컨텍스트에 프로그램 객체를 바인딩한 다음 프리미티브 렌더링을 실행해야 한다. 이러한 일련의 처리를 간소화하기 위해 몇 가지 GLSL 개발자 및 디자이너용 오서링 도구가 존재한다.
- https://gpuopen.com/archive/gamescgi/rendermonkey-toolsuite/ RenderMonkey - ATI에서 개발했다. DirectX 셰이더와 마찬가지로 GLSL 셰이더를 생성, 컴파일, 디버깅할 수 있는 인터페이스를 제공한다. Microsoft Windows에서만 실행할 수 있다. 으로 이관되었지만, 개발 및 지원은 종료되었다.
- GLSLEditorSample - macOS에서만 실행할 수 있는 Cocoa 애플리케이션. 셰이더 생성 및 컴파일은 가능하지만 디버거 기능은 내장되어 있지 않다.
- http://lumina.sourceforge.net/ Lumina - 새로운 GLSL 개발 도구. 플랫폼 독립적이며 인터페이스에 Qt를 사용한다.
- http://www.blender.org/ Blender - GPL 라이선스 모델링 및 애니메이션 제작 패키지로, 버전 2.4.1에서 내장된 게임 엔진이 GLSL을 지원하게 되었다.
- Mozilla Firefox - 개발자 도구로, WebGL용 버텍스 셰이더 및 프래그먼트 셰이더를 참조, 편집할 수 있는 "셰이더 에디터"가 구현되어 있다[34]。
8. 1. RenderMonkey (개발 중단)
ATI(현 AMD)에서 개발한 RenderMonkey는 GLSL 셰이더를 생성, 컴파일, 디버깅할 수 있는 인터페이스를 제공한다. Microsoft Windows에서만 실행할 수 있다. GPUOpen으로 이관되었지만, 개발 및 지원은 종료되었다.8. 2. 기타 도구
GLSL 셰이더는 셰이더 프로그램을 GPU에서 실행하기 위해 C/C++ 등으로 작성된 호스트 애플리케이션에 입력해야 한다. OpenGL API를 사용하여 셰이더 프로그램을 컴파일 및 링크한 후, OpenGL 렌더링 컨텍스트에 프로그램 객체를 바인딩한 다음 프리미티브 렌더링을 실행해야 하는데, 이러한 과정을 간소화 하기위한 몇가지 개발자 및 디자이너용 도구(오서링)가 존재한다.- RenderMonkey - ATI에서 개발했으며, DirectX 셰이더와 마찬가지로 GLSL 셰이더를 생성, 컴파일, 디버깅할 수 있는 인터페이스를 제공한다. Microsoft Windows에서만 실행할 수 있다. GPUOpen으로 이관되었지만, 개발 및 지원은 종료되었다.
- GLSLEditorSample는 macOS에서만 실행할 수 있는 Cocoa 애플리케이션이다. 셰이더 생성 및 컴파일은 가능하지만 디버거 기능은 내장되어 있지 않다.
- Lumina는 새로운 GLSL 개발 도구이며, 플랫폼 독립적이며 인터페이스에 Qt를 사용한다.
- Blender는 GPL 라이선스 모델링 및 애니메이션 제작 패키지로, 버전 2.4.1에서 내장된 게임 엔진이 GLSL을 지원하게 되었다.
- Mozilla Firefox의 개발자 도구에는 WebGL 셰이더를 편집할 수 있는 "셰이더 에디터"가 구현되어 있다.[34]
참조
[1]
웹사이트
GLSL Language Specification, Version 1.10.59
https://www.khronos.[...]
[2]
웹사이트
GLSL Language Specification, Version 1.20.8
https://www.khronos.[...]
[3]
웹사이트
GLSL Language Specification, Version 1.30.10
https://www.khronos.[...]
[4]
웹사이트
GLSL Language Specification, Version 1.40.08
https://www.khronos.[...]
[5]
웹사이트
GLSL Language Specification, Version 1.50.11
https://www.khronos.[...]
[6]
웹사이트
GLSL Language Specification, Version 3.30.6
https://www.khronos.[...]
[7]
웹사이트
GLSL Language Specification, Version 4.00.9
https://www.khronos.[...]
[8]
웹사이트
GLSL Language Specification, Version 4.10.6
https://www.khronos.[...]
[9]
웹사이트
GLSL Language Specification, Version 4.20.11
https://www.khronos.[...]
[10]
웹사이트
GLSL Language Specification, Version 4.30.8
https://www.khronos.[...]
[11]
웹사이트
GLSL Language Specification, Version 4.40.9
https://www.khronos.[...]
[12]
웹사이트
GLSL Language Specification, Version 4.50.7
https://www.khronos.[...]
[13]
웹사이트
GLSL Language Specification, Version 4.60.5
https://www.khronos.[...]
[14]
웹사이트
GLSL ES Language Specification, Version 1.00, revision 17
https://www.khronos.[...]
[15]
웹사이트
GLSL ES Language Specification, Version 3.00, revision 6
https://www.khronos.[...]
[16]
웹사이트
The OpenGL ES® Shading Language, version 3.10, revision 5
https://www.khronos.[...]
[17]
웹사이트
The OpenGL ES® Shading Language, Version 3.20.6
https://www.khronos.[...]
[18]
간행물
KhronosGroup/SPIRV-Cross
https://github.com/K[...]
The Khronos Group
2019-09-06
[19]
서적
OpenGL Programming Guide: The Official Guide to Learning OpenGL, Version 4.3, Eighth Edition
https://www.oreilly.[...]
[20]
웹사이트
ARB_shading_language_include
https://www.khronos.[...]
2020-05-31
[21]
웹사이트
NVIDIA driver 265.90 WHQL Quadro
https://forums.lapto[...]
[22]
웹사이트
Mesa 20.0.0 Release Notes / 2020-02-19
https://www.mesa3d.o[...]
2020-05-31
[23]
웹사이트
'#include directive support by antiagainst · Pull Request #46 · KhronosGroup/glslang'
https://github.com/K[...]
2020-05-31
[24]
웹사이트
'Preprocessing line number handling by antiagainst · Pull Request #38 · KhronosGroup/glslang'
https://github.com/K[...]
[25]
웹사이트
'Extend the syntax of #line and __FILE__ to support filename strings by antiagainst · Pull Request #43 · KhronosGroup/glslang'
https://github.com/K[...]
[26]
웹사이트
Metal Shading Language Specification Version 3.2
https://developer.ap[...]
[27]
문서
Core Image Kernel Language Reference
https://developer.ap[...]
[28]
문서
Android Graphics Shading Language (AGSL) | Views | Android Developers
https://developer.an[...]
[29]
문서
About the OpenGL Architecture Review Board Working Group
https://www.opengl.o[...]
[30]
문서
'The OpenGL(R) Graphics System: A Specification (Version 1.5)", p.294'
https://www.opengl.o[...]
[31]
문서
点 (GL_POINTS)、線分 (GL_LINES)、三角形 (GL_TRIANGLES) といった基本図形のこと。
[32]
문서
Shader Compiler Technologies - OpenGL, ESSL, GLSL Shaders
https://www.lunarg.c[...]
[33]
문서
Data Type (GLSL) - OpenGL Wiki
https://www.khronos.[...]
[34]
문서
シェーダーエディター - 開発ツール | MDN
https://developer.mo[...]
[35]
웹인용
GLSL Language Specification, Version 1.10.59
https://www.khronos.[...]
[36]
웹인용
GLSL Language Specification, Version 1.20.8
https://www.khronos.[...]
[37]
웹인용
GLSL Language Specification, Version 1.30.10
https://www.khronos.[...]
[38]
웹인용
GLSL Language Specification, Version 1.40.08
https://www.khronos.[...]
[39]
웹인용
GLSL Language Specification, Version 1.50.11
https://www.khronos.[...]
[40]
웹인용
GLSL Language Specification, Version 3.30.6
https://www.khronos.[...]
[41]
웹인용
GLSL Language Specification, Version 4.00.9
https://www.khronos.[...]
[42]
웹인용
GLSL Language Specification, Version 4.10.6
https://www.khronos.[...]
[43]
웹인용
GLSL Language Specification, Version 4.20.11
https://www.khronos.[...]
[44]
웹인용
GLSL Language Specification, Version 4.30.8
https://www.khronos.[...]
[45]
웹인용
GLSL Language Specification, Version 4.40.9
https://www.khronos.[...]
[46]
웹인용
GLSL Language Specification, Version 4.50.7
https://www.khronos.[...]
[47]
웹인용
GLSL Language Specification, Version 4.60.5
https://www.khronos.[...]
[48]
웹인용
GLSL ES Language Specification, Version 1.00, revision 17
https://www.khronos.[...]
[49]
웹인용
GLSL ES Language Specification, Version 3.00, revision 6
https://www.khronos.[...]
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com
