OpenGL Shading Language ( GLSL ) является высоким уровнем языка затенения с синтаксисом на основе языке программирования Си . Он был создан OpenGL ARB (OpenGL Architecture Review Board), чтобы дать разработчикам более прямой контроль над графическим конвейером без использования языка ассемблера 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 Shading Language (сокращенно: 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 элементов), для одного или обоих операндов. Общие встроенные функции, которые предусмотрены и которые обычно используются для графических целей являются: mix
, smoothstep
, normalize
, inversesqrt
, clamp
, length
, distance
, dot
, cross
, reflect
, refract
и вектор min
и max
. Другие функции , такие как abs
, sin
,pow
И т.д., предоставляется , но они также могут все работать на векторных величинах, то есть pow(vec3(1.5, 2.0, 2.5), abs(vec3(0.1, -0.2, 0.3)))
. GLSL поддерживает перегрузку функций (как для встроенных функций и операторов, так и для пользовательских функций), поэтому может быть несколько определений функций с одним и тем же именем, имеющих разное количество параметров или типов параметров. Каждый из них может иметь собственный независимый тип возвращаемого значения.
Препроцессор [ править ]
GLSL определяет подмножество препроцессора C (CPP) в сочетании с его собственными специальными директивами для указания версий и расширений OpenGL. Части, удаленные из CPP, относятся к таким именам файлов, как #include
и __FILE__
. [17]
GL_ARB_shading_language_include
Расширение [18] (реализуется, например , в драйверах Nvidia [19] на Windows , и Linux, и все Mesa 20.0.0 [20] Драйверы на Linux, FreeBSD и Android) осуществляет способность к использованию #include
в исходном коде, что позволяет проще совместное использование кода и определения между многими шейдерами без дополнительной ручной предварительной обработки. Подобное расширение 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 , Java и многих других.
Сами шейдеры 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 и являются обычным способом использования шейдеров в Vulkan. Шейдеры GLSL предварительно компилируются перед использованием или во время выполнения в двоичный формат байт-кода, называемый SPIR-V , обычно с использованием автономного компилятора.
См. Также [ править ]
- Стандартное портативное промежуточное представление , промежуточный язык шейдеров от Khronos Group
- 3D компьютерная графика
- Группа Хронос
- WebGL , диалект OpenGL-ES для веб-браузеров, использующий GLSL для шейдеров.
- Shadertoy
- LWJGL , библиотека, которая включает привязки Java для OpenGL.
Другие языки затенения [ править ]
- Язык ассемблера ARB , низкоуровневый язык затенения
- Cg , язык затенения высокого уровня для программирования вершинных и пиксельных шейдеров.
- HLSL , язык затенения высокого уровня для использования с Direct3D
- TGSI , промежуточный язык низкого уровня, представленный Gallium3D
- 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) .
- ^ KhronosGroup / SPIRV-Cross , The Khronos Group, 2019-09-06 , получено 2019-09-08
- ^ «Препроцессор шейдеров». Руководство по программированию OpenGL: Официальное руководство по изучению OpenGL, версия 4.3, восьмое издание .
- ^ "ARB_shading_language_include" . Khronos.org . Проверено 31 мая 2020 .
- ^ "Драйвер NVIDIA 265.90 WHQL Quadro" . НоутбукVideo2Go Форумы .
- ^ «Примечания к выпуску Mesa 20.0.0 / 19.02.2020» . www.mesa3d.org . Проверено 31 мая 2020 .
- ^ "#include поддержка директивы antiagainst · Запрос на извлечение # 46 · KhronosGroup / glslang" . GitHub . Проверено 31 мая 2020 .
- ^ "Предварительная обработка номера строки с помощью antiagainst · Pull Request # 38 · KhronosGroup / glslang" . GitHub .
- ^ "Расширить синтаксис #line и __FILE__ для поддержки строк имени файла с помощью antiagainst · Запрос на извлечение # 43 · KhronosGroup / glslang" . GitHub .
Дальнейшее чтение [ править ]
- Книги
- Рост, Рэнди Дж. (30 июля 2009 г.). OpenGL Shading Language (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.
Внешние ссылки [ править ]
В Викиучебнике есть книга по теме: Программирование на GLSL. |
- Официальный сайт OpenGL