OpenGL Shading Language explained

OpenGL Shading Language should not be confused with Open Shading Language.

OpenGL Shading Language (GLSL) is a high-level shading language with a syntax based on the C programming language. It was created by the OpenGL ARB (OpenGL Architecture Review Board) to give developers more direct control of the graphics pipeline without having to use ARB assembly language or hardware-specific languages.

Background

With advances in graphics cards, new features have been added to allow for increased flexibility in the rendering pipeline at the vertex and fragment level. Programmability at this level is achieved with the use of fragment and vertex shaders.

Originally, this functionality was achieved by writing shaders in ARB assembly language – a complex and unintuitive task. The OpenGL ARB created the OpenGL Shading Language to provide a more intuitive method for programming the graphics processing unit while maintaining the open standards advantage that has driven OpenGL throughout its history.

Originally introduced as an extension to OpenGL 1.4, GLSL was formally included into the OpenGL 2.0 core in 2004 by the OpenGL ARB. It was the first major revision to OpenGL since the creation of OpenGL 1.0 in 1992.

Some benefits of using GLSL are:

Versions

GLSL versions have evolved alongside specific versions of the OpenGL API. It is only with OpenGL versions 3.3 and above that the GLSL and OpenGL major and minor version numbers match. These versions for GLSL and OpenGL are related in the following table:

GLSL Version OpenGL Version Date Shader Preprocessor
1.10.59[1] 2.0 30 April 2004
  1. version 110
1.20.8[2] 2.1 07 September 2006
  1. version 120
1.30.10[3] 3.0 22 November 2009
  1. version 130
1.40.08[4] 3.1 22 November 2009
  1. version 140
1.50.11[5] 3.2 04 December 2009
  1. version 150
3.30.6[6] 3.3 11 March 2010
  1. version 330
4.00.9[7] 4.0 24 July 2010
  1. version 400
4.10.6[8] 4.1 24 July 2010
  1. version 410
4.20.11[9] 4.2 12 December 2011
  1. version 420
4.30.8[10] 4.3 7 February 2013
  1. version 430
4.40.9[11] 4.4 16 June 2014
  1. version 440
4.50.7[12] 4.5 09 May 2017
  1. version 450
4.60.5[13] 4.6 14 June 2018
  1. version 460

OpenGL ES and WebGL use OpenGL ES Shading Language (abbreviated: GLSL ES or ESSL).

GLSL ES version OpenGL ES version WebGL version Based on GLSL version Date Shader Preprocessor
1.00.17[14] 2.0 1.0 1.20 12 May 2009
  1. version 100
3.00.6[15] 3.0 2.0 3.30 29 January 2016
  1. version 300 es
3.10.5[16] 3.1GLSL ES 3.0029 January 2016
  1. version 310 es
3.20.6[17] 3.2GLSL ES 3.1010 July 2019
  1. version 320 es

The two languages are related but not directly compatible. They can be interconverted through SPIRV-Cross.

Language

Operators

GLSL contains the same operators as the operators in C and C++, with the exception of pointers. Bitwise operators were added in version 1.30.

Functions and control structures

Similar to the C programming language, GLSL supports loops and branching, for instance: if-else, for, switch, etc. Recursion is forbidden and checked for during compilation.

User-defined functions are supported and built-in functions are provided. The graphics card manufacturer may optimize built-in functions at the hardware level. Many of these functions are similar to those in the math library of the C programming language while others are specific to graphics programming. Most of the built-in functions and operators, can operate both on scalars and vectors (up to 4 elements), for one or both operands. Common built-in functions that are provided and are commonly used for graphics purposes are:,,,,,,,,,, and vector and . Other functions like,,, etc, are provided but they can also all operate on vector quantities, i.e. . GLSL supports function overloading (for both built-in functions and operators, and user-defined functions), so there might be multiple function definitions with the same name, having different number of parameters or parameter types. Each of them can have own independent return type.

Preprocessor

GLSL defines a subset of the C preprocessor (CPP), combined with its own special directives for specifying versions and OpenGL extensions. The parts removed from CPP are those relating to file names such as and .[18]

The extension[19] (implemented for example in Nvidia drivers[20] on Windows and Linux, and all Mesa 20.0.0[21] drivers on Linux, FreeBSD and Android) implements ability to use in source code, allowing easier sharing of code and definitions between many shaders without extra manual pre-processing. Similar extension and exist for using GLSL with Vulkan, and are supported in reference SPIR-V compiler (aka glslangValidator).[22] [23] [24]

Compilation and execution

GLSL shaders are not stand-alone applications; they require an application that utilizes the OpenGL API, which is available on many different platforms (e.g., Linux, macOS, Windows). There are language bindings for C, C++, C#, JavaScript, Delphi, Java, and many more.

GLSL shaders themselves are simply a set of strings that are passed to the hardware vendor's driver for compilation from within an application using the OpenGL API's entry points. Shaders can be created on the fly from within an application, or read-in as text files, but must be sent to the driver in the form of a string.

The set of APIs used to compile, link, and pass parameters to GLSL programs are specified in three OpenGL extensions, and became part of core OpenGL as of OpenGL Version 2.0. The API was expanded with geometry shaders in OpenGL 3.2, tessellation shaders in OpenGL 4.0 and compute shaders in OpenGL 4.3. These OpenGL APIs are found in the extensions:

GLSL shaders can also be used with Vulkan, and are a common way of using shaders in Vulkan. GLSL shaders are precompiled before use, or at runtime, into a binary bytecode format called SPIR-V, usually using offline compiler.

See also

Other shading languages

References

Citations

Further reading

Books

External links

Notes and References

  1. Web site: GLSL Language Specification, Version 1.10.59.
  2. Web site: GLSL Language Specification, Version 1.20.8.
  3. Web site: GLSL Language Specification, Version 1.30.10.
  4. Web site: GLSL Language Specification, Version 1.40.08.
  5. Web site: GLSL Language Specification, Version 1.50.11.
  6. Web site: GLSL Language Specification, Version 3.30.6.
  7. Web site: GLSL Language Specification, Version 4.00.9.
  8. Web site: GLSL Language Specification, Version 4.10.6.
  9. Web site: GLSL Language Specification, Version 4.20.11.
  10. Web site: GLSL Language Specification, Version 4.30.8.
  11. Web site: GLSL Language Specification, Version 4.40.9.
  12. Web site: GLSL Language Specification, Version 4.50.7.
  13. Web site: GLSL Language Specification, Version 4.60.5.
  14. Web site: GLSL ES Language Specification, Version 1.00, revision 17.
  15. Web site: GLSL ES Language Specification, Version 3.00, revision 6.
  16. Web site: The OpenGL ES® Shading Language, version 3.10, revision 5.
  17. Web site: The OpenGL ES® Shading Language, Version 3.20.6.
  18. Book: OpenGL Programming Guide: The Official Guide to Learning OpenGL, Version 4.3, Eighth Edition . en . Shader Preprocessor.
  19. Web site: ARB_shading_language_include . Khronos.org . 2020-05-31.
  20. Web site: NVIDIA driver 265.90 WHQL Quadro . LaptopVideo2Go Forums.
  21. Web site: Mesa 20.0.0 Release Notes / 2020-02-19 . www.mesa3d.org . 2020-05-31.
  22. Web site: #include directive support by antiagainst · Pull Request #46 · KhronosGroup/glslang . GitHub . 2020-05-31 . en.
  23. Web site: Preprocessing line number handling by antiagainst · Pull Request #38 · KhronosGroup/glslang . GitHub . en.
  24. Web site: Extend the syntax of #line and __FILE__ to support filename strings by antiagainst · Pull Request #43 · KhronosGroup/glslang . GitHub . en.
  25. Web site: https://developer.apple.com/metal/Metal-Shading-Language-Specification.pdf Metal Shading Language Specification Version 3.2].