Язык шейдинга OpenGL - OpenGL Shading Language

Видеоигры передать расчеты рендеринга на GPU над OpenGL в реальном времени. Шейдеры написаны на Язык шейдинга OpenGL и скомпилирован. Скомпилированные программы выполняются на графическом процессоре.

Язык шейдинга 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.030 апреля 2004 г.#version 110
1.20.8[2]2.107 сентября 2006 г.#version 120
1.30.10[3]3.022 ноября 2009 г.#version 130
1.40.08[4]3.122 ноября 2009 г.#version 140
1.50.11[5]3.24 декабря 2009 г.#version 150
3.30.6[6]3.311 марта 2010 г.#version 330
4.00.9[7]4.024 июля 2010 г.#version 400
4.10.6[8]4.124 июля 2010 г.#version 410
4.20.11[9]4.212 декабря 2011 г.#version 420
4.30.8[10]4.37 февраля 2013 г.#version 430
4.40.9[11]4.416 июня 2014 г.#version 440
4.50.7[12]4.509 мая 2017#version 450
4.60.5[13]4.614 июня 2018 г.#version 460

OpenGL ES и WebGL использовать Язык шейдинга OpenGL ES (сокращенно: GLSL ES или же ESSL).

Версия GLSL ESВерсия OpenGL ESВерсия WebGLНа основе версии GLSLДатаПрепроцессор шейдеров
1.00.17[14]2.01.01.2012 мая 2009 года#version 100
3.00.6[15]3.02.03.3029 января 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 предварительно компилируются перед использованием или во время выполнения в двоичный формат байт-кода, называемый СПИР-В, обычно с использованием автономного компилятора.

Смотрите также

Другие языки штриховки

  • Язык ассемблера ARB, язык затенения низкого уровня
  • Cg, высокоуровневый язык затенения для программирования вершинных и пиксельных шейдеров.
  • HLSL, язык затенения высокого уровня для использования с Direct3D
  • TGSI, промежуточный язык низкого уровня, представленный Галлий3D
  • AMDIL, промежуточный язык низкого уровня, используемый внутри AMD
  • Язык затенения RenderMan

Рекомендации

Цитаты
  1. ^ «Спецификация языка GLSL, версия 1.10.59» (PDF).
  2. ^ «Спецификация языка GLSL, версия 1.20.8» (PDF).
  3. ^ «Спецификация языка GLSL, версия 1.30.10» (PDF).
  4. ^ «Спецификация языка GLSL, версия 1.40.08» (PDF).
  5. ^ «Спецификация языка GLSL, версия 1.50.11» (PDF).
  6. ^ «Спецификация языка GLSL, версия 3.30.6» (PDF).
  7. ^ «Спецификация языка GLSL, версия 4.00.9» (PDF).
  8. ^ «Спецификация языка GLSL, версия 4.10.6» (PDF).
  9. ^ «Спецификация языка GLSL, версия 4.20.11» (PDF).
  10. ^ "Спецификация языка GLSL, версия 4.30.8" (PDF).
  11. ^ "Спецификация языка GLSL, версия 4.40.9" (PDF).
  12. ^ «Спецификация языка GLSL, версия 4.50.7» (PDF).
  13. ^ "Спецификация языка GLSL, версия 4.60.5" (PDF).
  14. ^ «Спецификация языка GLSL ES, версия 1.00, редакция 17» (PDF).
  15. ^ «Спецификация языка GLSL ES, версия 3.00, редакция 6» (PDF).
  16. ^ ХроносГрупп / СПИРВ-Кросс, Группа Хронос, 2019-09-06, получено 2019-09-08
  17. ^ «Препроцессор шейдеров». Руководство по программированию OpenGL: официальное руководство по изучению OpenGL, версия 4.3, восьмое издание.
  18. ^ "ARB_shading_language_include". Khronos.org. Получено 2020-05-31.
  19. ^ "Драйвер NVIDIA 265.90 WHQL Quadro". НоутбукVideo2Go Форумы.
  20. ^ «Примечания к выпуску Mesa 20.0.0 / 19.02.2020». www.mesa3d.org. Получено 2020-05-31.
  21. ^ "Поддержка директивы #include со стороны antiagainst · Запрос на включение # 46 · KhronosGroup / glslang". GitHub. Получено 2020-05-31.
  22. ^ "Предварительная обработка номера строки с помощью antiagainst · Pull Request # 38 · KhronosGroup / glslang". GitHub.
  23. ^ «Расширить синтаксис #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.

внешняя ссылка