Введение

Язык затенения высокого уровня OpenGL Shading Language (GLSL) — это язык затенения высокого уровня с синтаксисом, основанным на языке программирования C. Он был разработан OpenGL ARB (OpenGL Architecture Review Board), чтобы предоставить разработчикам более прямой контроль над графическим конвейером, не прибегая к использованию ассемблера ARB или языков, специфичных для аппаратного обеспечения.

Версии

Версии GLSL развивались вместе с конкретными версиями API OpenGL. Только с версиями OpenGL 3.3 и выше номера основных и второстепенных версий GLSL и OpenGL совпадают. Связь между этими версиями для GLSL и OpenGL представлена в следующей таблице:

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

OpenGL ES и WebGL используют язык OpenGL ES Shading Language (сокращенно: GLSL ES или 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 мая 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

Эти два языка связаны, но не напрямую совместимы. Они могут быть преобразованы с помощью 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).