stringtranslate.com

Язык шейдеров OpenGL

Видеоигры передают вычисления рендеринга графическому процессору через OpenGL в режиме реального времени. Шейдеры написаны на языке шейдеров 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:

Версии

Версии GLSL развивались вместе с конкретными версиями API OpenGL. Только в OpenGL версии 3.3 и выше номера основных и второстепенных версий GLSL и OpenGL совпадают. Эти версии для GLSL и OpenGL связаны в следующей таблице:

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

Эти два языка родственны, но не совместимы напрямую. Их можно конвертировать через 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а также Vector minи max. Предусмотрены и другие функции, такие как abs, sin, и т. д., но все они также могут работать с векторными величинами, т.е. GLSL поддерживает перегрузку функций (как для встроенных функций и операторов, так и для пользовательских функций), поэтому может существовать несколько определений функций с одним и тем же именем, имеющим разное количество параметров или типов параметров. Каждый из них может иметь собственный независимый тип возвращаемого значения.powpow(vec3(1.5, 2.0, 2.5), abs(vec3(0.1, -0.2, 0.3)))

Препроцессор

GLSL определяет подмножество препроцессора C (CPP) в сочетании со своими собственными специальными директивами для указания версий и расширений OpenGL. Из CPP удалены части, относящиеся к именам файлов, например #includeи __FILE__. [19]

Расширение [20] (реализованное, например, в драйверах Nvidia [21] для Windows и Linux и во всех драйверах Mesa 20.0.0 [22] в Linux, FreeBSD и Android) реализует возможность использования в исходном коде, что упрощает совместное использование кода GL_ARB_shading_language_include. и определения между многими шейдерами без дополнительной ручной предварительной обработки. Аналогичное расширение существует для использования GLSL с Vulkan и поддерживается в эталонном компиляторе SPIR-V ( также известном как glslangValidator). [23] [24] [25]#includeGL_GOOGLE_include_directiveGL_GOOGLE_cpp_style_line_directiveglslang

Компиляция и исполнение

Шейдеры 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 находятся в расширениях:

Шейдеры GLSL также можно использовать с Vulkan и являются распространенным способом использования шейдеров в Vulkan. Шейдеры GLSL предварительно компилируются перед использованием или во время выполнения в формат двоичного байт-кода, называемый SPIR-V , обычно с использованием автономного компилятора.

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

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

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

Цитаты
  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. ^ «Язык шейдеров OpenGL ES®, версия 3.10, редакция 5» (PDF) .
  17. ^ «Язык шейдеров OpenGL ES®, версия 3.20.6» (PDF) .
  18. KhronosGroup/SPIRV-Cross, The Khronos Group, 06 сентября 2019 г. , получено 8 сентября 2019 г.
  19. ^ «Препроцессор шейдеров». Руководство по программированию OpenGL: Официальное руководство по изучению OpenGL, версия 4.3, восьмое издание.
  20. ^ "ARB_shading_language_include". Хронос.орг . Проверено 31 мая 2020 г.
  21. ^ «Драйвер NVIDIA 265.90 WHQL Quadro» . Форумы LaptopVideo2Go .
  22. ^ «Примечания к выпуску Mesa 20.0.0 / 19 февраля 2020 г.» . www.mesa3d.org . Проверено 31 мая 2020 г.
  23. ^ «#include поддержка директивы antiagainst · Запрос на извлечение № 46 · KhronosGroup/glslang» . Гитхаб . Проверено 31 мая 2020 г.
  24. ^ «Обработка номера строки предварительной обработки с помощью antiagainst · Запрос на извлечение № 38 · KhronosGroup/glslang» . Гитхаб .
  25. ^ «Расширьте синтаксис #line и __FILE__ для поддержки строк имен файлов с помощью antiagainst · Запрос на извлечение № 43 · KhronosGroup/glslang». Гитхаб .

дальнейшее чтение

Книги

Внешние ссылки