OpenGL Shading Language - OpenGL Shading Language
OpenGL Shading Sprog ( GLSL ) er et højt niveau skygge sprog med en syntaks baseret på sproget C programmering . Det blev oprettet af OpenGL ARB (OpenGL Architecture Review Board) for at give udviklere mere direkte kontrol over grafikrørledningen uden at skulle bruge ARB-samlingssprog eller hardwarespecifikke sprog.
Baggrund
Med fremskridt inden for grafikkort er nye funktioner blevet tilføjet for at muliggøre øget fleksibilitet i gengivelsesrørledningen på toppunkt- og fragmentniveau . Programmerbarhed på dette niveau opnås ved brug af fragment- og vertex shaders .
Oprindeligt blev denne funktionalitet opnået ved at skrive shaders på ARB-samlingssprog - en kompleks og uintuitiv opgave. Den OpenGL ARB skabte OpenGL Shading Sprog for at give en mere intuitiv metode til programmering af graphics processing unit samtidig med at den åbne standarder fordel, der har drevet OpenGL gennem hele sin historie.
Oprindeligt introduceret som en udvidelse til OpenGL 1.4, blev GLSL formelt inkluderet i OpenGL 2.0-kernen i 2004 af OpenGL ARB. Det var den første store revision af OpenGL siden oprettelsen af OpenGL 1.0 i 1992.
Nogle fordele ved at bruge GLSL er:
- Kompatibilitet på tværs af platforme på flere operativsystemer, inklusive Linux , macOS og Windows .
- Evnen til at skrive shaders, der kan bruges på enhver hardwareleverandørs grafikkort, der understøtter OpenGL Shading Language.
- Hver hardwareleverandør inkluderer GLSL-kompilatoren i deres driver, hvilket giver hver leverandør mulighed for at oprette kode optimeret til deres specifikke grafikkorts arkitektur.
Versioner
GLSL-versioner har udviklet sig sammen med specifikke versioner af OpenGL API. Det er kun med OpenGL-version 3.3 og derover, at GLSL- og OpenGL-hoved- og mindreversionsnumrene stemmer overens. Disse versioner til GLSL og OpenGL er relateret til følgende tabel:
| GLSL-version | OpenGL-version | Dato | Shader Preprocessor |
|---|---|---|---|
| 1.10.59 | 2.0 | 30. april 2004 | #version 110 |
| 1.20.8 | 2.1 | 7. september 2006 | #version 120 |
| 1.30.10 | 3.0 | 22. november 2009 | #version 130 |
| 1.40.08 | 3.1 | 22. november 2009 | #version 140 |
| 1.50.11 | 3.2 | 4. december 2009 | #version 150 |
| 3.30.6 | 3.3 | 11. marts 2010 | #version 330 |
| 4.00.9 | 4.0 | 24. juli 2010 | #version 400 |
| 4.10.6 | 4.1 | 24. juli 2010 | #version 410 |
| 4.20.11 | 4.2 | 12. december 2011 | #version 420 |
| 4.30.8 | 4.3 | 7. februar 2013 | #version 430 |
| 4.40.9 | 4.4 | 16. juni 2014 | #version 440 |
| 4.50.7 | 4.5 | 9. maj 2017 | #version 450 |
| 4.60.5 | 4.6 | 14. juni 2018 | #version 460 |
OpenGL ES og WebGL bruger OpenGL ES Shading Language (forkortet: GLSL ES eller ESSL ).
| GLSL ES-version | OpenGL ES-version | WebGL-version | Baseret på GLSL version | Dato | Shader Preprocessor |
|---|---|---|---|---|---|
| 1.00.17 | 2.0 | 1.0 | 1.20 | 12. maj 2009 | #version 100 |
| 3.00.6 | 3.0 | 2.0 | 3.30 | 29. januar 2016 | #version 300 es |
| 3.10.5 | 3.1 | GLSL ES 3.00 | 29. januar 2016 | #version 310 es | |
| 3.20.6 | 3.2 | GLSL ES 3.10 | 10. juli 2019 | #version 320 es |
De to sprog er beslægtede, men ikke direkte kompatible. De kan interkonverteres gennem SPIR-Cross .
Sprog
Operatører
GLSL indeholder de samme operatorer som operatorerne i C og C ++ , med undtagelse af markører . Bitvis operatører blev tilføjet i version 1.30.
Funktioner og kontrolstrukturer
I lighed med programmeringssproget C understøtter GLSL sløjfer og forgrening, for eksempel: hvis-ellers, for, switch osv. Rekursion er forbudt og kontrolleret under kompilering.
Brugerdefinerede funktioner understøttes og indbyggede funktioner leveres. Grafikkortproducenten optimerer muligvis indbyggede funktioner på hardwareniveau. Mange af disse funktioner ligner dem i matematikbiblioteket i C-programmeringssproget, mens andre er specifikke for grafisk programmering. De fleste af de indbyggede funktioner og operatører kan fungere både på skalarer og vektorer (op til 4 elementer) til en eller begge operander. Fælles indbyggede funktioner, der leveres, og er almindeligt anvendt til grafik formål er: mix, smoothstep, normalize, inversesqrt, clamp, length, distance, dot, cross, reflect, refractog vektor minog max. Andre funktioner kan lide abs, sin, powosv, er forudsat, men de kan også alle operere på vektor mængder, dvs. pow(vec3(1.5, 2.0, 2.5), abs(vec3(0.1, -0.2, 0.3))). GLSL understøtter overbelastning af funktioner (for både indbyggede funktioner og operatører og brugerdefinerede funktioner), så der kan være flere funktionsdefinitioner med samme navn med forskellige antal parametre eller parametertyper. Hver af dem kan have sin egen uafhængige returtype.
Forprocessor
GLSL definerer et undersæt af C preprocessoren (CPP) kombineret med sine egne specielle direktiver til angivelse af versioner og OpenGL-udvidelser. Dele fjernet fra CPP er dem, der vedrører filnavne som #includeog __FILE__.
Den GL_ARB_shading_language_includeudvidelse (gennemført for eksempel i Nvidia drivere på Windows og Linux, og alle Mesa 20.0.0 drivere på Linux, FreeBSD og Android) redskaber evne til brug #includei kildekode, der giver lettere deling af kode og definitioner mellem mange shaders uden ekstra manuel præ -forarbejdning. Lignende udvidelse GL_GOOGLE_include_directiveog GL_GOOGLE_cpp_style_line_directivefindes til brug af GLSL med Vulkan og understøttes i reference SPIR-V-kompilator ( glslangaka glslangValidator).
Kompilering og udførelse
GLSL shaders er ikke enkeltstående applikationer; de kræver en applikation, der bruger OpenGL API, som er tilgængelig på mange forskellige platforme (f.eks. Linux , macOS , Windows ). Der er sprogbindinger til C , C ++ , C # , JavaScript , Delphi , Java og mange flere.
GLSL shaders selv er simpelthen et sæt strenge , der sendes til hardwareleverandørens driver til kompilering fra en applikation ved hjælp af OpenGL API's indgangspunkter. Shaders kan oprettes i farten fra en applikation eller læses ind som tekstfiler, men skal sendes til driveren i form af en streng.
Sættet af API'er, der bruges til at kompilere, linke og overføre parametre til GLSL-programmer, er specificeret i tre OpenGL-udvidelser og blev en del af kernen i OpenGL fra og med OpenGL Version 2.0. API'en blev udvidet med geometry shaders i OpenGL 3.2, tessellation shaders i OpenGL 4.0 og compute shaders i OpenGL 4.3. Disse OpenGL API'er findes i udvidelserne:
- ARB vertex skygge
- ARB fragment shader
- ARB shader objekter
- ARB geometry shader 4
- ARB tessellation shader
- ARB Compute Shader
GLSL shaders kan også bruges med Vulkan og er en almindelig måde at bruge shaders i Vulkan på. GLSL-skyggeleggere er forudkompileret før brug eller ved kørsel til et binært bytecode-format kaldet SPIR-V , normalt ved hjælp af offline compiler.
Se også
- Standard Portable Intermediate Representation , et mellemliggende skyggesprog fra Khronos Group
- 3D computergrafik
- Khronos Group
- WebGL , en OpenGL-ES-dialekt til webbrowsere, der bruger GLSL til shaders
- Shadertoy
- LWJGL , et bibliotek, der indeholder Java-bindinger til OpenGL.
Andre skygge sprog
- ARB-monteringssprog , et skyggesprog på lavt niveau
- Cg , et skyggesprog på højt niveau til programmering af vertex og pixel shaders
- HLSL , et skyggesprog på højt niveau til brug med Direct3D
- TGSI , et mellemliggende sprog på lavt niveau introduceret af Gallium3D
- AMDIL , et mellemniveausprog på lavt niveau, der bruges internt hos AMD
- RenderMan Shading Language
Referencer
- Citater
Yderligere læsning
- Bøger
- Rost, Randi J. (30. juli 2009). OpenGL Shading Language (3. udgave). Addison-Wesley. ISBN 978-0-321-63763-5.
- Kessenich, John; Baldwin, David; Rost, Randi. OpenGL Shading Language . Version 1.10.59. 3Dlabs, Inc. Ltd.
- Bailey, Mike; Cunningham, Steve (22. april 2009). Graphics Shaders: Theory and Practice (2. udgave). CRC Tryk. ISBN 978-1-56881-434-6.