Введение
Язык затенения высокого уровня OpenGL Shading Language (GLSL) — это язык затенения высокого уровня с синтаксисом, основанным на языке программирования C. Он был разработан OpenGL ARB (OpenGL Architecture Review Board), чтобы предоставить разработчикам более прямой контроль над графическим конвейером, не прибегая к использованию ассемблера ARB или языков, специфичных для аппаратного обеспечения.
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.
Версии
Версии GLSL развивались вместе с конкретными версиями API OpenGL. Только с версиями OpenGL 3.3 и выше номера основных и второстепенных версий GLSL и OpenGL совпадают. Связь между этими версиями для GLSL и OpenGL представлена в следующей таблице:
GLSL Version OpenGL Version Date Shader Preprocessor 1.10.59 2.0 30 April 2004 #version 110 1.20.8 2.1 07 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 04 December 2009 #version 150 3.30.6 3.3 11 March 2010 #version 330 4.00.9 4.0 24 July 2010 #version 400 4.10.6 4.1 24 July 2010 #version 410 4.20.11 4.2 12 December 2011 #version 420 4.30.8 4.3 7 February 2013 #version 430 4.40.9 4.4 16 June 2014 #version 440 4.50.7 4.5 09 May 2017 #version 450 4.60.5 4.6 14 June 2018 #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 2.0 1.0 1.20 12 May 2009 #version 100 3.00.6 3.0 2.0 3.30 29 January 2016 #version 300 es3.10.53.1GLSL ES 3.0029 January 2016#version 310 es3.20.63.2GLSL ES 3.1010 July 2019#version 320 es
The two languages are related but not directly compatible. They can be interconverted through SPIRV Cross.
GLSL Version OpenGL Version Date Shader Preprocessor
1.10.59 2.0 30 апреля 2004 #version 110
1.20.8 2.1 07 сентября 2006 #version 120
1.30.10 3.0 22 ноября 2009 #version 130
1.40.08 3.1 22 ноября 2009 #version 140
1.50.11 3.2 04 декабря 2009 #version 150
3.30.6 3.3 11 марта 2010 #version 330
4.00.9 4.0 24 июля 2010 #version 400
4.10.6 4.1 24 июля 2010 #version 410
4.20.11 4.2 12 декабря 2011 #version 420
4.30.8 4.3 7 февраля 2013 #version 430
4.40.9 4.4 16 июня 2014 #version 440
4.50.7 4.5 09 мая 2017 #version 450
4.60.5 4.6 14 июня 2018 #version 460
GLSL Version OpenGL Version Date Shader Preprocessor 1.10.59 2.0 30 April 2004 #version 110 1.20.8 2.1 07 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 04 December 2009 #version 150 3.30.6 3.3 11 March 2010 #version 330 4.00.9 4.0 24 July 2010 #version 400 4.10.6 4.1 24 July 2010 #version 410 4.20.11 4.2 12 December 2011 #version 420 4.30.8 4.3 7 February 2013 #version 430 4.40.9 4.4 16 June 2014 #version 440 4.50.7 4.5 09 May 2017 #version 450 4.60.5 4.6 14 June 2018 #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 2.0 1.0 1.20 12 May 2009 #version 100 3.00.6 3.0 2.0 3.30 29 January 2016 #version 300 es3.10.53.1GLSL ES 3.0029 January 2016#version 310 es3.20.63.2GLSL ES 3.1010 July 2019#version 320 es
The two languages are related but not directly compatible. They can be interconverted through SPIRV Cross.
OpenGL ES и WebGL используют язык OpenGL ES Shading Language (сокращенно: GLSL ES или ESSL).
GLSL Version OpenGL Version Date Shader Preprocessor 1.10.59 2.0 30 April 2004 #version 110 1.20.8 2.1 07 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 04 December 2009 #version 150 3.30.6 3.3 11 March 2010 #version 330 4.00.9 4.0 24 July 2010 #version 400 4.10.6 4.1 24 July 2010 #version 410 4.20.11 4.2 12 December 2011 #version 420 4.30.8 4.3 7 February 2013 #version 430 4.40.9 4.4 16 June 2014 #version 440 4.50.7 4.5 09 May 2017 #version 450 4.60.5 4.6 14 June 2018 #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 2.0 1.0 1.20 12 May 2009 #version 100 3.00.6 3.0 2.0 3.30 29 January 2016 #version 300 es3.10.53.1GLSL ES 3.0029 January 2016#version 310 es3.20.63.2GLSL ES 3.1010 July 2019#version 320 es
The two languages are related but not directly compatible. They can be interconverted through SPIRV Cross.
GLSL ES version OpenGL ES version WebGL version Based on GLSL version Date Shader Preprocessor
1.00.17 2.0 1.0 1.20 12 мая 2009 #version 100
3.00.6 3.0 2.0 3.30 29 января 2016 #version 300 es
3.10.5 3.1 - 3.30 29 января 2016 #version 310 es
3.20.6 3.2 - 3.30 10 июля 2019 #version 320 es
GLSL Version OpenGL Version Date Shader Preprocessor 1.10.59 2.0 30 April 2004 #version 110 1.20.8 2.1 07 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 04 December 2009 #version 150 3.30.6 3.3 11 March 2010 #version 330 4.00.9 4.0 24 July 2010 #version 400 4.10.6 4.1 24 July 2010 #version 410 4.20.11 4.2 12 December 2011 #version 420 4.30.8 4.3 7 February 2013 #version 430 4.40.9 4.4 16 June 2014 #version 440 4.50.7 4.5 09 May 2017 #version 450 4.60.5 4.6 14 June 2018 #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 2.0 1.0 1.20 12 May 2009 #version 100 3.00.6 3.0 2.0 3.30 29 January 2016 #version 300 es3.10.53.1GLSL ES 3.0029 January 2016#version 310 es3.20.63.2GLSL ES 3.1010 July 2019#version 320 es
The two languages are related but not directly compatible. They can be interconverted through SPIRV Cross.
Эти два языка связаны, но не напрямую совместимы. Они могут быть преобразованы с помощью SPIRV Cross.
GLSL Version OpenGL Version Date Shader Preprocessor 1.10.59 2.0 30 April 2004 #version 110 1.20.8 2.1 07 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 04 December 2009 #version 150 3.30.6 3.3 11 March 2010 #version 330 4.00.9 4.0 24 July 2010 #version 400 4.10.6 4.1 24 July 2010 #version 410 4.20.11 4.2 12 December 2011 #version 420 4.30.8 4.3 7 February 2013 #version 430 4.40.9 4.4 16 June 2014 #version 440 4.50.7 4.5 09 May 2017 #version 450 4.60.5 4.6 14 June 2018 #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 2.0 1.0 1.20 12 May 2009 #version 100 3.00.6 3.0 2.0 3.30 29 January 2016 #version 300 es3.10.53.1GLSL ES 3.0029 January 2016#version 310 es3.20.63.2GLSL ES 3.1010 July 2019#version 320 es
The two languages are related but not directly compatible. They can be interconverted through SPIRV Cross.
Операторы
GLSL содержит те же операторы, что и в языках C и C++, за исключением указателей. Побитовые операторы были добавлены в версии 1.30.
Функции и структуры управления
Подобно языку программирования C, GLSL поддерживает циклы и ветвления, например: if else, for, switch и т.д. Рекурсия запрещена и проверяется при компиляции. Поддерживаются функции, определенные пользователем, и предоставляются встроенные функции. Производитель видеокарты может оптимизировать встроенные функции на аппаратном уровне. Многие из этих функций аналогичны функциям из математической библиотеки языка программирования C, в то время как другие специфичны для графического программирования. Большинство встроенных функций и операторов могут работать как со скалярами, так и с векторами (до 4 элементов), для одного или обоих операндов. Часто используемые встроенные функции для графических целей включают: , , , , , , , и вектор , а также другие функции, такие как , , , и т.д., которые также могут оперировать векторными величинами. То есть, GLSL поддерживает перегрузку функций (как для встроенных функций и операторов, так и для пользовательских функций), поэтому может существовать несколько определений функций с одним и тем же именем, различающихся количеством или типами параметров. Каждое из них может иметь свой собственный независимый тип возвращаемого значения.
Предварительно обработанный материал
GLSL определяет подмножество препроцессора C (CPP) в сочетании со своими собственными специальными директивами для указания версий и расширений OpenGL. Из CPP исключены части, связанные с именами файлов, такие как #include и #define. Расширение (реализованное, например, в драйверах Nvidia на Windows и Linux, и во всех драйверах Mesa 20.0.0 на Linux, FreeBSD и Android) обеспечивает возможность использования #include в исходном коде, что позволяет легче обмениваться кодом и определениями между множеством шейдеров без дополнительной ручной предобработки. Аналогичные расширения существуют для использования GLSL с Vulkan и поддерживаются в эталонном компиляторе SPIR-V (также известном как glslangValidator).
The extension (implemented for example in Nvidia drivers on Windows and Linux, and all Mesa 20.0.0 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).