OpenGL Shading Language ( GLSL ) — это язык шейдеров высокого уровня с синтаксисом, основанным на языке программирования C. Он был создан OpenGL ARB (Советом по обзору архитектуры OpenGL), чтобы дать разработчикам более прямой контроль над графическим конвейером без необходимости использовать язык ассемблера ARB или языки, специфичные для аппаратного обеспечения.
С развитием видеокарт были добавлены новые функции, обеспечивающие повышенную гибкость конвейера рендеринга на уровне вершин и фрагментов . Программируемость на этом уровне достигается за счет использования фрагментных и вершинных шейдеров .
Изначально эта функциональность достигалась путем написания шейдеров на ассемблере ARB — задача сложная и неинтуитивная. OpenGL ARB создал язык шейдеров OpenGL, чтобы обеспечить более интуитивный метод программирования графического процессора , сохраняя при этом преимущество открытых стандартов, которое поддерживало OpenGL на протяжении всей его истории.
Первоначально представленный как расширение OpenGL 1.4, GLSL был официально включен в ядро OpenGL 2.0 в 2004 году OpenGL ARB. Это была первая крупная редакция OpenGL с момента создания OpenGL 1.0 в 1992 году.
Некоторые преимущества использования GLSL:
Версии GLSL развивались вместе с конкретными версиями API OpenGL. Только в OpenGL версии 3.3 и выше номера основных и второстепенных версий GLSL и OpenGL совпадают. Эти версии для GLSL и OpenGL связаны в следующей таблице:
OpenGL ES и WebGL используют язык шейдеров OpenGL ES (сокращенно: GLSL ES или ESSL ).
Эти два языка родственны, но не совместимы напрямую. Их можно конвертировать через SPIRV-Cross . [18]
GLSL содержит те же операторы, что и операторы в C и C++ , за исключением указателей . Побитовые операторы были добавлены в версии 1.30.
Подобно языку программирования C , GLSL поддерживает циклы и ветвления, например: if-else, for, switch и т. д. Рекурсия запрещена и проверяется во время компиляции.
Поддерживаются пользовательские функции и предоставляются встроенные функции. Производитель видеокарты может оптимизировать встроенные функции на аппаратном уровне. Многие из этих функций аналогичны функциям математической библиотеки языка программирования C, тогда как другие предназначены только для графического программирования. Большинство встроенных функций и операторов могут работать как со скалярами, так и с векторами (до 4 элементов), с одним или обоими операндами. Общие встроенные функции, которые предоставляются и обычно используются для графических целей: mix
, smoothstep
, normalize
, inversesqrt
, clamp
, length
, distance
, dot
, cross
, reflect
, refract
а также Vector min
и max
. Предусмотрены и другие функции, такие как abs
, sin
, и т. д., но все они также могут работать с векторными величинами, т.е. GLSL поддерживает перегрузку функций (как для встроенных функций и операторов, так и для пользовательских функций), поэтому может существовать несколько определений функций с одним и тем же именем, имеющим разное количество параметров или типов параметров. Каждый из них может иметь собственный независимый тип возвращаемого значения.pow
pow(vec3(1.5, 2.0, 2.5), abs(vec3(0.1, -0.2, 0.3)))
GLSL определяет подмножество препроцессора C (CPP) в сочетании со своими собственными специальными директивами для указания версий и расширений OpenGL. Из CPP удалены части, относящиеся к именам файлов, например #include
и __FILE__
. [19]
Расширение [20] (реализованное, например, в драйверах Nvidia [21] для Windows и Linux и во всех драйверах Mesa 20.0.0 [22] в Linux, FreeBSD и Android) реализует возможность использования в исходном коде, что упрощает совместное использование кода GL_ARB_shading_language_include
. и определения между многими шейдерами без дополнительной ручной предварительной обработки. Аналогичное расширение существует для использования GLSL с Vulkan и поддерживается в эталонном компиляторе SPIR-V ( также известном как glslangValidator). [23] [24] [25]#include
GL_GOOGLE_include_directive
GL_GOOGLE_cpp_style_line_directive
glslang
Шейдеры GLSL не являются автономными приложениями; им требуется приложение, использующее API OpenGL, доступное на многих различных платформах (например, Linux , macOS , Windows ). Существуют языковые привязки для C , C++ , C# , JavaScript , Delphi , Java и многих других.
Сами шейдеры GLSL представляют собой просто набор строк , которые передаются драйверу поставщика оборудования для компиляции из приложения с использованием точек входа API OpenGL. Шейдеры можно создавать «на лету» из приложения или считывать в виде текстовых файлов, но их необходимо отправлять драйверу в виде строки.
Набор API, используемых для компиляции, связывания и передачи параметров в программы GLSL, указан в трех расширениях OpenGL и стал частью ядра OpenGL начиная с OpenGL версии 2.0. API был расширен за счет шейдеров геометрии в OpenGL 3.2, шейдеров тесселяции в OpenGL 4.0 и вычислительных шейдеров в OpenGL 4.3. Эти API OpenGL находятся в расширениях:
Шейдеры GLSL также можно использовать с Vulkan и являются распространенным способом использования шейдеров в Vulkan. Шейдеры GLSL предварительно компилируются перед использованием или во время выполнения в формат двоичного байт-кода, называемый SPIR-V , обычно с использованием автономного компилятора.