Из Википедии, бесплатной энциклопедии
  (Перенаправлено с GLSL )
Перейти к навигации Перейти к поиску
Видеоигры передают вычисления рендеринга графическому процессору через OpenGL в реальном времени. Шейдеры написаны на языке шейдеров OpenGL и скомпилированы. Скомпилированные программы выполняются на графическом процессоре.

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 связаны в следующей таблице:

OpenGL ES и WebGL используют OpenGL ES Shading Language (сокращенно: GLSL ES или ESSL ).

Эти два языка связаны, но не совместимы напрямую. Их можно преобразовать друг в друга через 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

Ссылки [ править ]

Цитаты
  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. ^ KhronosGroup / SPIRV-Cross , The Khronos Group, 2019-09-06 , получено 2019-09-08
  17. ^ «Препроцессор шейдеров». Руководство по программированию OpenGL: Официальное руководство по изучению OpenGL, версия 4.3, восьмое издание .
  18. ^ "ARB_shading_language_include" . Khronos.org . Проверено 31 мая 2020 .
  19. ^ "Драйвер NVIDIA 265.90 WHQL Quadro" . НоутбукVideo2Go Форумы .
  20. ^ «Примечания к выпуску Mesa 20.0.0 / 19.02.2020» . www.mesa3d.org . Проверено 31 мая 2020 .
  21. ^ "#include поддержка директивы antiagainst · Запрос на извлечение # 46 · KhronosGroup / glslang" . GitHub . Проверено 31 мая 2020 .
  22. ^ "Предварительная обработка номера строки с помощью antiagainst · Pull Request # 38 · KhronosGroup / glslang" . GitHub .
  23. ^ "Расширить синтаксис #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.

Внешние ссылки [ править ]

  • Официальный сайт OpenGL