Язык шейдеров OpenGL
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:
- Кроссплатформенная совместимость с несколькими операционными системами, включая Linux , macOS и Windows .
- Возможность писать шейдеры, которые можно использовать на видеокарте любого производителя оборудования, поддерживающей язык шейдеров OpenGL.
- Каждый поставщик оборудования включает компилятор GLSL в свой драйвер, что позволяет каждому поставщику создавать код, оптимизированный для конкретной архитектуры видеокарты.
Версии [ править ]
Версии GLSL развивались вместе с конкретными версиями API OpenGL. Только в OpenGL версии 3.3 и выше номера основных и второстепенных версий GLSL и OpenGL совпадают. Эти версии для GLSL и OpenGL связаны в следующей таблице:
ГЛСЛ-версия | OpenGL-версия | Дата | Препроцессор шейдеров |
---|---|---|---|
1.10.59 [1] | 2.0 | 30 апреля 2004 г. | #версия 110 |
1.20.8 [2] | 2.1 | 07 сентября 2006 г. | #версия 120 |
1.30.10 [3] | 3.0 | 22 ноября 2009 г. | #версия 130 |
1.40.08 [4] | 3.1 | 22 ноября 2009 г. | #версия 140 |
1.50.11 [5] | 3.2 | 04 декабря 2009 г. | #версия 150 |
3.30.6 [6] | 3.3 | 11 марта 2010 г. | #версия 330 |
4.00.9 [7] | 4.0 | 24 июля 2010 г. | #версия 400 |
4.10.6 [8] | 4.1 | 24 июля 2010 г. | #версия 410 |
4.20.11 [9] | 4.2 | 12 декабря 2011 г. | #версия 420 |
4.30.8 [10] | 4.3 | 7 февраля 2013 г. | #версия 430 |
4.40.9 [11] | 4.4 | 16 июня 2014 г. | #версия 440 |
4.50.7 [12] | 4.5 | 09 мая 2017 г. | #версия 450 |
4.60.5 [13] | 4.6 | 14 июня 2018 г. | #версия 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 г. | #версия 100 |
3.00.6 [15] | 3.0 | 2.0 | 3.30 | 29 января 2016 г. | #версия 300 ru |
3.10.5 [16] | 3.1 | ГЛСЛ ES 3.00 | 29 января 2016 г. | #версия 310 ru | |
3.20.6 [17] | 3.2 | ГЛСЛ ES 3.10 | 10 июля 2019 г. | #версия 320 ru |
Эти два языка родственны, но не совместимы напрямую. Их можно конвертировать через 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
и вектор 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__
. [19]
The GL_ARB_shading_language_include
расширение [20] (реализовано, например, в драйверах Nvidia [21] на Windows и Linux и всех Mesa 20.0.0 [22] драйверы для Linux, FreeBSD и Android) реализует возможность использования #include
в исходном коде, что позволяет упростить обмен кодом и определениями между многими шейдерами без дополнительной предварительной обработки вручную. Подобное расширение GL_GOOGLE_include_directive
и GL_GOOGLE_cpp_style_line_directive
существуют для использования GLSL с Vulkan и поддерживаются в эталонном компиляторе SPIR-V ( glslang
он же glslangValidator). [23] [24] [25]
Компиляция и исполнение [ править ]
Шейдеры 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 находятся в расширениях:
- Вершинный шейдер ARB
- Фрагментный шейдер ARB
- Объекты шейдера ARB
- Геометрический шейдер ARB 4
- Тесселяционный шейдер ARB
- Вычислительный шейдер ARB
Шейдеры GLSL также можно использовать с Vulkan и являются распространенным способом использования шейдеров в Vulkan. Шейдеры GLSL предварительно компилируются перед использованием или во время выполнения в формат двоичного байт-кода, называемый SPIR-V , обычно с использованием автономного компилятора.
См. также [ править ]
- Standard Portable Intermediate Representation — промежуточный язык шейдеров от Khronos Group.
- 3D компьютерная графика
- Хронос Групп
- WebGL , диалект OpenGL-ES для веб-браузеров, который использует GLSL для шейдеров.
- Шадертой
- LWJGL — библиотека, включающая привязки Java для OpenGL.
Другие языки штриховки [ править ]
- Язык ассемблера ARB — низкоуровневый язык шейдеров.
- Cg — язык шейдеров высокого уровня для программирования вершинных и пиксельных шейдеров.
- HLSL — язык шейдеров высокого уровня для использования с Direct3D.
- TGSI , промежуточный язык низкого уровня, представленный Gallium3D.
- AMDIL — промежуточный язык низкого уровня, используемый внутри компании AMD.
- Язык шейдеров RenderMan
- WGSL , язык шейдеров с синтаксисом, похожим на Rust, для WebGPU, изначально основанный на SPIR-V.
Ссылки [ править ]
- Цитаты
- ^ «Спецификация языка 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) .
- ^ «Язык шейдеров OpenGL ES®, версия 3.10, редакция 5» (PDF) .
- ^ «Язык шейдеров OpenGL ES®, версия 3.20.6» (PDF) .
- ^ KhronosGroup/SPIRV-Cross , The Khronos Group, 2019-09-06 , retrieved 2019-09-08
- ^ «Шейдерный препроцессор». Руководство по программированию OpenGL: Официальное руководство по изучению OpenGL, версия 4.3, восьмое издание .
- ^ «ARB_shading_language_include» . Хронос.орг . Проверено 31 мая 2020 г.
- ^ «Драйвер NVIDIA 265.90 WHQL Quadro» . Форумы LaptopVideo2Go .
- ^ «Примечания к выпуску Mesa 20.0.0 / 19 февраля 2020 г.» . www.mesa3d.org . Проверено 31 мая 2020 г.
- ^ «#include поддержка директивы antiagainst · Pull Request #46 · KhronosGroup/glslang» . Гитхаб . Проверено 31 мая 2020 г.
- ^ «Обработка номера строки предварительной обработки с помощью antiagainst · Pull Request #38 · KhronosGroup/glslang» . Гитхаб .
- ^ «Расширьте синтаксис #line и __FILE__ для поддержки строк имен файлов с помощью antiagainst · Pull Request #43 · KhronosGroup/glslang» . Гитхаб .
Дальнейшее чтение [ править ]
- Книги
- Рост, Рэнди Дж. (30 июля 2009 г.). Язык шейдеров OpenGL (3-е изд.). Аддисон-Уэсли. ISBN 978-0-321-63763-5 .
- Кессенич, Джон; Болдуин, Дэвид; Рост, Рэнди. Язык шейдеров OpenGL . Версия 1.10.59. 3Dlabs, Inc. Ltd.
- Бейли, Майк; Каннингем, Стив (22 апреля 2009 г.). Графические шейдеры: теория и практика (2-е изд.). ЦРК Пресс. ISBN 978-1-56881-434-6 .