Язык шейдинга OpenGL - OpenGL Shading Language
Язык шейдинга OpenGL (GLSL) это высокий уровень язык затенения с синтаксисом, основанным на Язык программирования C. Он был создан OpenGL ARB (Совет по обзору архитектуры OpenGL), чтобы дать разработчикам более прямой контроль над графический конвейер без необходимости использовать Язык ассемблера ARB или аппаратно-зависимые языки.
Фон
С развитием графических карт были добавлены новые функции, позволяющие повысить гибкость конвейера рендеринга на вершина и фрагмент уровень. Программируемость на этом уровне достигается за счет использования фрагмента и вершины. шейдеры.
Первоначально эта функциональность была достигнута путем написания шейдеров в Язык ассемблера ARB - сложная и неинтуитивная задача. В OpenGL ARB создал OpenGL Shading Language, чтобы обеспечить более интуитивный метод программирования графический процессор сохраняя при этом преимущество открытых стандартов, которым руководствовался OpenGL на протяжении всей его истории.
Первоначально представленный как расширение OpenGL 1.4, GLSL был официально включен в ядро OpenGL 2.0 в 2004 году OpenGL ARB. Это была первая серьезная версия OpenGL с момента создания OpenGL 1.0 в 1992 году.
Некоторые преимущества использования GLSL:
- Кроссплатформенность совместимость с несколькими операционными системами, включая Linux, macOS и Windows.
- Возможность писать шейдеры, которые можно использовать на видеокартах любого производителя оборудования, поддерживающих OpenGL Shading Language.
- Каждый поставщик оборудования включает компилятор GLSL в свой драйвер, что позволяет каждому поставщику создавать код, оптимизированный для архитектуры их конкретной видеокарты.
Версии
Версии GLSL развивались вместе с конкретными версиями OpenGL API. Только в OpenGL версии 3.3 и выше основные и дополнительные номера версий GLSL и OpenGL совпадают. Эти версии для GLSL и OpenGL связаны в следующей таблице:
Версия GLSL | Версия OpenGL | Дата | Препроцессор шейдеров |
---|---|---|---|
1.10.59[1] | 2.0 | 30 апреля 2004 г. | #version 110 |
1.20.8[2] | 2.1 | 07 сентября 2006 г. | #version 120 |
1.30.10[3] | 3.0 | 22 ноября 2009 г. | #version 130 |
1.40.08[4] | 3.1 | 22 ноября 2009 г. | #version 140 |
1.50.11[5] | 3.2 | 4 декабря 2009 г. | #version 150 |
3.30.6[6] | 3.3 | 11 марта 2010 г. | #version 330 |
4.00.9[7] | 4.0 | 24 июля 2010 г. | #version 400 |
4.10.6[8] | 4.1 | 24 июля 2010 г. | #version 410 |
4.20.11[9] | 4.2 | 12 декабря 2011 г. | #version 420 |
4.30.8[10] | 4.3 | 7 февраля 2013 г. | #version 430 |
4.40.9[11] | 4.4 | 16 июня 2014 г. | #version 440 |
4.50.7[12] | 4.5 | 09 мая 2017 | #version 450 |
4.60.5[13] | 4.6 | 14 июня 2018 г. | #version 460 |
OpenGL ES и WebGL использовать Язык шейдинга OpenGL ES (сокращенно: GLSL ES или же ESSL).
Версия GLSL ES | Версия OpenGL ES | Версия WebGL | На основе версии GLSL | Дата | Препроцессор шейдеров |
---|---|---|---|---|---|
1.00.17[14] | 2.0 | 1.0 | 1.20 | 12 мая 2009 года | #version 100 |
3.00.6[15] | 3.0 | 2.0 | 3.30 | 29 января 2016 г. | #version 300 es |
Эти два языка связаны, но не совместимы напрямую. Их можно преобразовать SPIR-Cross.[16]
Язык
Операторы
GLSL содержит те же операторы, что и операторы в C и C ++, за исключением указатели. Побитовые операторы были добавлены в версии 1.30.
Функции и управляющие структуры
Подобно Язык программирования C, GLSL поддерживает циклы и ветвления, например: if-else, for, switch и т. Д. Рекурсия запрещена и проверяется во время компиляции.
Поддерживаются пользовательские функции и предоставляются встроенные функции. Производитель видеокарты может оптимизировать встроенные функции на аппаратном уровне. Многие из этих функций аналогичны функциям математической библиотеки языка программирования C, а другие относятся только к графическому программированию. Большинство встроенных функций и операторов могут работать как со скалярами, так и с векторами (до 4 элементов), для одного или обоих операндов. Общие встроенные функции, которые предоставляются и обычно используются для графических целей: смешивание
, плавный шаг
, нормализовать
, обратный
, зажим
, длина
, расстояние
, точка
, Пересекать
, отражать
, преломлять
и вектор мин
и Максимум
. Другие функции, такие как пресс
, грех
, пау
и т. д., но все они также могут работать с векторными величинами, т.е. pow (vec3 (1.5, 2.0, 2.5), abs (vec3 (0.1, -0.2, 0.3)))
. GLSL поддерживает перегрузка функции (как для встроенных функций и операторов, так и для пользовательских функций), поэтому может быть несколько определений функций с одним и тем же именем, имеющих разное количество параметров или типов параметров. У каждого из них может быть собственный независимый тип возвращаемого значения.
Препроцессор
GLSL определяет подмножество Препроцессор C (CPP) в сочетании с собственными специальными директивами для указания версий и расширений OpenGL. Части, удаленные из CPP, относятся к именам файлов, например #включают
и __ФАЙЛ__
.[17]
В GL_ARB_shading_language_include
расширение[18] (реализовано например в драйверах Nvidia[19] в Windows и Linux, и все Mesa 20.0.0[20] драйверов для Linux, FreeBSD и Android) реализует возможность использования #включают
в исходном коде, что упрощает совместное использование кода и определений между многими шейдерами без дополнительной ручной предварительной обработки. Подобное расширение GL_GOOGLE_include_directive
и GL_GOOGLE_cpp_style_line_directive
существуют для использования GLSL с Vulkan и поддерживаются эталонным компилятором SPIR-V (glslang
он же glslangValidator).[21][22][23]
Составление и исполнение
Шейдеры GLSL не являются автономными приложениями; им требуется приложение, использующее OpenGL API, доступный на многих различных платформах (например, Linux, macOS, Windows ). Есть языковые привязки для C, C ++, C #, JavaScript, Delphi, Ява и многое другое.
Сами шейдеры GLSL - это просто набор струны которые передаются в драйвер поставщика оборудования для компиляции из приложения с использованием точек входа OpenGL API. Шейдеры могут быть созданы на лету из приложения или считывания в виде текстовых файлов, но должны быть отправлены драйверу в виде строки.
Набор API, используемых для компиляции, связывания и передачи параметров в программы GLSL, указан в трех расширениях OpenGL и стал частью ядра OpenGL начиная с OpenGL версии 2.0. API был расширен геометрическими шейдерами в OpenGL 3.2, тесселяционными шейдерами в OpenGL 4.0 и вычислить шейдеры в OpenGL 4.3. Эти API OpenGL находятся в расширениях:
- Вершинный шейдер ARB
- Фрагментный шейдер ARB
- Объекты шейдера ARB
- Геометрический шейдер ARB 4
- Шейдер тесселяции ARB
- Вычислительный шейдер ARB
Шейдеры GLSL также можно использовать с Вулкан, и являются распространенным способом использования шейдеров в Vulkan. Шейдеры GLSL предварительно компилируются перед использованием или во время выполнения в двоичный формат байт-кода, называемый СПИР-В, обычно с использованием автономного компилятора.
Смотрите также
- Стандартное портативное промежуточное представление, промежуточный шейдерный язык от Khronos Group
- 3D компьютерная графика
- Хронос Групп
- WebGL, диалект OpenGL-ES для веб-браузеров, использующий GLSL для шейдеров
- Shadertoy
- LWJGL, библиотека, которая включает привязки Java для OpenGL.
Другие языки штриховки
- Язык ассемблера ARB, язык затенения низкого уровня
- Cg, высокоуровневый язык затенения для программирования вершинных и пиксельных шейдеров.
- HLSL, язык затенения высокого уровня для использования с Direct3D
- TGSI, промежуточный язык низкого уровня, представленный Галлий3D
- AMDIL, промежуточный язык низкого уровня, используемый внутри AMD
- Язык затенения RenderMan
Рекомендации
- Цитаты
- ^ «Спецификация языка GLSL, версия 1.10.59» (PDF).
- ^ «Спецификация языка GLSL, версия 1.20.8» (PDF).
- ^ «Спецификация языка GLSL, версия 1.30.10» (PDF).
- ^ «Спецификация языка GLSL, версия 1.40.08» (PDF).
- ^ «Спецификация языка GLSL, версия 1.50.11» (PDF).
- ^ «Спецификация языка GLSL, версия 3.30.6» (PDF).
- ^ «Спецификация языка GLSL, версия 4.00.9» (PDF).
- ^ «Спецификация языка GLSL, версия 4.10.6» (PDF).
- ^ «Спецификация языка GLSL, версия 4.20.11» (PDF).
- ^ "Спецификация языка GLSL, версия 4.30.8" (PDF).
- ^ "Спецификация языка GLSL, версия 4.40.9" (PDF).
- ^ «Спецификация языка GLSL, версия 4.50.7» (PDF).
- ^ "Спецификация языка GLSL, версия 4.60.5" (PDF).
- ^ «Спецификация языка GLSL ES, версия 1.00, редакция 17» (PDF).
- ^ «Спецификация языка GLSL ES, версия 3.00, редакция 6» (PDF).
- ^ ХроносГрупп / СПИРВ-Кросс, Группа Хронос, 2019-09-06, получено 2019-09-08
- ^ «Препроцессор шейдеров». Руководство по программированию OpenGL: официальное руководство по изучению OpenGL, версия 4.3, восьмое издание.
- ^ "ARB_shading_language_include". Khronos.org. Получено 2020-05-31.
- ^ "Драйвер NVIDIA 265.90 WHQL Quadro". НоутбукVideo2Go Форумы.
- ^ «Примечания к выпуску Mesa 20.0.0 / 19.02.2020». www.mesa3d.org. Получено 2020-05-31.
- ^ "Поддержка директивы #include со стороны antiagainst · Запрос на включение # 46 · KhronosGroup / glslang". GitHub. Получено 2020-05-31.
- ^ "Предварительная обработка номера строки с помощью antiagainst · Pull Request # 38 · KhronosGroup / glslang". GitHub.
- ^ «Расширить синтаксис #line и __FILE__ для поддержки строк имени файла с помощью antiagainst · Запрос на извлечение # 43 · KhronosGroup / glslang». GitHub.
дальнейшее чтение
- Книги
- Рост, Рэнди Дж. (30 июля 2009 г.). Язык шейдинга OpenGL (3-е изд.). Эддисон-Уэсли. ISBN 978-0-321-63763-5.
- Кессенич, Джон; Болдуин, Дэвид; Рост, Рэнди. Язык шейдинга OpenGL. Версия 1.10.59. 3Dlabs, Inc. Ltd.
- Бейли, Майк; Каннингем, Стив (22 апреля 2009 г.). Графические шейдеры: теория и практика (2-е изд.). CRC Press. ISBN 978-1-56881-434-6.