OpenGL 셰이딩 언어
OpenGL Shading LanguageGLSL(OpenGL Shading Language)은 C 프로그래밍 언어에 기반한 구문을 가진 고급 쉐이딩 언어입니다.OpenGL Architecture Review Board(OpenGL Architecture Review Board)에 의해 개발자가 ARB 어셈블리 언어나 하드웨어 고유의 언어를 사용하지 않고도 그래픽 파이프라인을 보다 직접적으로 제어할 수 있도록 하기 위해 개발되었습니다.
배경
그래픽 카드의 진화에 수반해, 정점 레벨과 프래그먼트 레벨의 렌더링 파이프라인의 유연성을 높이는 새로운 기능이 추가되고 있습니다.이 레벨에서는 프래그먼트 및 정점 셰이더를 사용하여 프로그래밍할 수 있습니다.
원래 이 기능은 셰이더를 ARB 어셈블리 언어로 작성함으로써 실현되었습니다.이것은 복잡하고 의도적이지 않은 작업입니다.OpenGL ARB는 OpenGL의 역사를 통해 OpenGL을 주도해 온 개방형 표준 장점을 유지하면서 그래픽 처리 장치를 프로그래밍하는 보다 직관적인 방법을 제공하기 위해 OpenGL Shading Language를 만들었습니다.
원래 OpenGL 1.4의 확장으로 도입된 GLSL은 2004년 OpenGL ARB에 의해 OpenGL 2.0 코어에 공식적으로 포함되었습니다.1992년 OpenGL 1.0이 만들어진 이후 OpenGL에 대한 첫 번째 주요 개정판입니다.
GLSL을 사용하면 다음과 같은 이점이 있습니다.
- Linux, macOS, Windows 등 여러 운영체제에서의 크로스 플랫폼 호환성
- OpenGL Shading Language를 지원하는 모든 하드웨어 벤더의 그래픽 카드에서 사용할 수 있는 셰이더 쓰기 기능.
- 각 하드웨어 벤더는 드라이버에 GLSL 컴파일러를 포함하므로 각 벤더는 특정 그래픽 카드 아키텍처에 최적화된 코드를 작성할 수 있습니다.
버전
GLSL 버전은 OpenGL API의 특정 버전과 함께 발전했습니다.GLSL 및 OpenGL 메이저 및 마이너버전 번호가 일치하는 것은 OpenGL 버전 3.3 이후뿐입니다.GLSL 및 OpenGL의 이러한 버전은 다음 표에 관련되어 있습니다.
GLSL 버전 | OpenGL 버전 | 날짜. | 셰이더 프리프로세서 |
---|---|---|---|
1.10.59[1] | 2.0 | 2004년 4월 30일 | #버전 110 |
1.20.8[2] | 2.1 | 2006년 9월 7일 | #버전 120 |
1.30.10[3] | 3.0 | 2009년 11월 22일 | #버전 130 |
1.40.08[4] | 3.1 | 2009년 11월 22일 | #버전 140 |
1.50.11[5] | 3.2 | 2009년 12월 4일 | #버전 150 |
3.30.6[6] | 3.3 | 2010년 3월 11일 | #버전 330 |
4.00.9[7] | 4.0 | 2010년 7월 24일 | # 버전 400 |
4.10.6[8] | 4.1 | 2010년 7월 24일 | #버전 410 |
4.20.11[9] | 4.2 | 2011년 12월 12일 | #버전 420 |
4.30.8[10] | 4.3 | 2013년 2월 7일 | #버전 430 |
4.40.9[11] | 4.4 | 2014년 6월 16일 | # 버전 440 |
4.50.7[12] | 4.5 | 2017년 5월 9일 | # 버전 450 |
4.60.5[13] | 4.6 | 2018년 6월 14일 | #버전 460 |
OpenGL ES 및 WebGL은 OpenGL ES Shading Language(약칭: GLSL ES 또는 ESSL)를 사용합니다.
GLSL ES 버전 | OpenGL ES 버전 | WebGL 버전 | GLSL 버전을 기반으로 합니다. | 날짜. | 셰이더 프리프로세서 |
---|---|---|---|---|---|
1.00.17[14] | 2.0 | 1.0 | 1.20 | 2009년 5월 12일 | # 버전 100 |
3.00.6[15] | 3.0 | 2.0 | 3.30 | 2016년 1월 29일 | #버전 300 es |
3.10.5[16] | 3.1 | GLSL ES 3.00 | 2016년 1월 29일 | #버전 310 es | |
3.20.6[17] | 3.2 | GLSL ES 3.10 | 2019년 7월 10일 | # 버전 320 es |
두 언어는 관련이 있지만 직접 호환되지는 않습니다.SPR-Cross를 [18]통해 상호 변환할 수 있습니다.
언어
연산자
GLSL에는 포인터를 제외하고 C 및 C++의 연산자와 동일한 연산자가 포함되어 있습니다.비트 연산자는 버전 1.30에서 추가되었습니다.
기능 및 제어 구조
C 프로그래밍 언어와 마찬가지로 GLSL은 if-else, for, switch 등의 루프와 브런치를 지원합니다.컴파일 중에 재귀가 금지되고 확인됩니다.
사용자 정의 기능이 지원되며 내장 기능이 제공됩니다.그래픽 카드 제조원은 내장 기능을 하드웨어 수준에서 최적화할 수 있습니다.이러한 기능의 대부분은 C 프로그래밍 언어의 수학 라이브러리와 비슷하지만 다른 기능은 그래픽 프로그래밍에 특화되어 있습니다.내장 함수 및 연산자의 대부분은 1개 또는 양쪽 오퍼랜드에 대해 스칼라와 벡터(최대 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 Preprocessor(CPP; 프리프로세서)의 서브셋을 정의하며 버전 및 OpenGL 확장을 지정하기 위한 자체 특수 지시와 결합합니다.CPP에서 삭제된 부품은 다음과 같은 파일 이름과 관련된 부품입니다.#include
그리고.__FILE__
를 클릭합니다.[19]
그GL_ARB_shading_language_include
extension(예를 들어 Windows 및[21] Linux의 Nvidia 드라이버 및 Linux, FreeBSD 및 Android의 모든 Mesa[22] 20.0 드라이버에 구현됨)은[20] 다음과 같은 기능을 구현합니다.#include
소스 코드에서 추가 수동 사전 처리 없이 많은 셰이더 간에 코드와 정의를 쉽게 공유할 수 있습니다.유사 내선번호GL_GOOGLE_include_directive
그리고.GL_GOOGLE_cpp_style_line_directive
Vulkan에서 GLSL을 사용하기 위해 존재하며 참조 SPER-V 컴파일러에서 지원됩니다.glslang
glslangValidator).[23][24][25]
컴파일 및 실행
GLSL 셰이더는 독립형 애플리케이션이 아닙니다.이러한 애플리케이션에는 다양한 플랫폼(Linux, macOS, Windows 등)에서 사용할 수 있는 OpenGL API를 사용하는 애플리케이션이 필요합니다.C, C++, C#, JavaScript, Delphi, Java 등의 언어 바인딩이 있습니다.
GLSL 셰이더 자체는 OpenGL API의 진입점을 사용하는 애플리케이션 내에서 컴파일하기 위해 하드웨어 벤더의 드라이버로 전달되는 문자열 세트입니다.셰이더는 응용 프로그램 내에서 즉시 생성하거나 텍스트 파일로 읽을 수 있지만 문자열 형식으로 드라이버에 전송해야 합니다.
파라미터 컴파일, 링크 및 GLSL 프로그램 전달에 사용되는 API 세트는 3개의 OpenGL 확장자로 지정되며 OpenGL 버전 2.0부터 핵심 OpenGL의 일부가 되었습니다.API는 OpenGL 3.2 지오메트리 셰이더, OpenGL 4.0 테셀레이션 셰이더, OpenGL 4.3 컴퓨팅 셰이더로 확장되었습니다.다음 OpenGL API는 확장자에 있습니다.
- ARB 정점 셰이더
- ARB 프래그먼트쉐이더
- ARB 셰이더 객체
- ARB 지오메트리 셰이더 4
- ARB 테셀레이션 셰이더
- ARB 계산 셰이더
GLSL 셰이더는 Vulkan에서도 사용할 수 있으며 Vulkan에서 셰이더를 사용하는 일반적인 방법입니다.GLSL 셰이더는 사용 전 또는 실행 시 SPR-V라는 바이너리 바이트 코드 형식으로 사전 컴파일되며, 일반적으로 오프라인 컴파일러를 사용합니다.
「 」를 참조해 주세요.
- Khronos Group의 중간 셰이더 언어인 표준 휴대용 중간 표현
- 3D 컴퓨터 그래픽스
- 크로노스 그룹
- WebGL, 웹 브라우저용 OpenGL-ES 방언으로 셰이더에 GLSL을 사용합니다.
- 셰이더토이
- LWJGL, OpenGL용 Java 바인딩을 포함하는 라이브러리입니다.
기타 음영 언어
- ARB 어셈블리 언어, 로우 레벨 음영 언어
- Cg, 정점 및 픽셀 셰이더를 프로그래밍하기 위한 고급 쉐이딩 언어
- HLSL, Direct3와 함께 사용하기 위한 고급 음영 언어D.
- Galium3가 도입한 저레벨 중간 언어인 TGSID.
- AMDIL, AMD에서 내부적으로 사용되는 낮은 수준의 중간 언어
- RenderMan 음영 언어
레퍼런스
- 인용문
- ^ "GLSL Language Specification, Version 1.10.59" (PDF).
- ^ "GLSL Language Specification, Version 1.20.8" (PDF).
- ^ "GLSL Language Specification, Version 1.30.10" (PDF).
- ^ "GLSL Language Specification, Version 1.40.08" (PDF).
- ^ "GLSL Language Specification, Version 1.50.11" (PDF).
- ^ "GLSL Language Specification, Version 3.30.6" (PDF).
- ^ "GLSL Language Specification, Version 4.00.9" (PDF).
- ^ "GLSL Language Specification, Version 4.10.6" (PDF).
- ^ "GLSL Language Specification, Version 4.20.11" (PDF).
- ^ "GLSL Language Specification, Version 4.30.8" (PDF).
- ^ "GLSL Language Specification, Version 4.40.9" (PDF).
- ^ "GLSL Language Specification, Version 4.50.7" (PDF).
- ^ "GLSL Language Specification, Version 4.60.5" (PDF).
- ^ "GLSL ES Language Specification, Version 1.00, revision 17" (PDF).
- ^ "GLSL ES Language Specification, Version 3.00, revision 6" (PDF).
- ^ "The OpenGL ES® Shading Language, version 3.10, revision 5" (PDF).
{{cite web}}
: CS1 maint :url-status (링크) - ^ "The OpenGL ES® Shading Language, Version 3.20.6" (PDF).
{{cite web}}
: CS1 maint :url-status (링크) - ^ KhronosGroup/SPIRV-Cross, The Khronos Group, 2019-09-06, retrieved 2019-09-08
- ^ "Shader Preprocessor". OpenGL Programming Guide: The Official Guide to Learning OpenGL, Version 4.3, Eighth Edition.
- ^ "ARB_shading_language_include". Khronos.org. Retrieved 2020-05-31.
- ^ "NVIDIA driver 265.90 WHQL Quadro". LaptopVideo2Go Forums.
- ^ "Mesa 20.0.0 Release Notes / 2020-02-19". www.mesa3d.org. Retrieved 2020-05-31.
- ^ "#include directive support by antiagainst · Pull Request #46 · KhronosGroup/glslang". GitHub. Retrieved 2020-05-31.
- ^ "Preprocessing line number handling by antiagainst · Pull Request #38 · KhronosGroup/glslang". GitHub.
- ^ "Extend the syntax of #line and __FILE__ to support filename strings by antiagainst · Pull Request #43 · KhronosGroup/glslang". GitHub.
추가 정보
- 책들
- Rost, Randi J. (30 July 2009). OpenGL Shading Language (3rd ed.). Addison-Wesley. ISBN 978-0-321-63763-5.
- Kessenich, John; Baldwin, David; Rost, Randi. The OpenGL Shading Language. Version 1.10.59. 3Dlabs, Inc. Ltd.
- Bailey, Mike; Cunningham, Steve (22 April 2009). Graphics Shaders: Theory and Practice (2nd ed.). CRC Press. ISBN 978-1-56881-434-6.