Инструменты Qt для шейдеров
Введение
Модуль Qt Shader Tools опирается на открытый экосистему SPIR-V, как описано на сайте Khronos SPIR-V https://www.khronos.org/spir/. Для компиляции в SPIR-V используется glslang https://github.com/KhronosGroup/glslang, а для трансляции и отражения — SPIRV-Cross https://github.com/KhronosGroup/SPIRV-Cross.
Для возможности написания кода шейдеров один раз в приложениях и библиотеках Qt, все шейдеры должны быть написаны на одном языке, который затем компилируется в SPIR-V. В настоящее время этот язык шейдинга — совместимый с Vulkan GLSL. Это отличается от GLSL в стиле OpenGL, ожидаемого Qt 5.x. См. спецификацию GL_KHR_vulkan_glsl для обзора различий.
Исходный код для других языков шейдинга, таких как GLSL, HLSL и Metal Shading Language, генерируется путем трансляции байткода SPIR-V вместе с информацией об отражении (входы, выходы, ресурсы шейдера). В частности, для GLSL это также включает в себя генерацию нескольких вариантов, то есть исходного кода, подходящего для разных версий GLSL, таких как GLSL ES 100, GLSL ES 300, GLSL 120, 150 и т.д. Все это упаковывается в сериализуемые объекты контейнера QShader, обычно хранящиеся на диске в виде файлов с расширением .qsb. Интерфейс аппаратного ускорения рендеринга Qt потребляет экземпляры QShader напрямую, выбирая исходный код шейдера или байткод, который лучше всего подходит для используемого в ходе выполнения графического API. Объект QShader обычно десериализуется из файлов .qsb, поставляемых с приложением или Qt в системе ресурсов Qt.
Некоторые платформы предоставляют возможность компиляции исходного кода шейдера в промежуточный формат, аналогичный SPIR-V. Это включает в себя запуск платформно-специфических инструментов. В случае Direct 3D инструмент qsb предоставляет возможность вызова инструмента fxc из набора средств Windows SDK после генерации исходного кода HLSL. Затем он заменяет исходный код HLSL на двоичный файл DXBC, сгенерированный fxc. Это может положительно повлиять на время выполнения приложений, поскольку им больше не нужно выполнять первую фазу компиляции (исходный код HLSL в DXBC) самостоятельно. Для macOS и iOS аналогичные инструменты предоставляет SDK XCode https://developer.apple.com/documentation/metal/libraries/building_a_library_with_metal_s_command-line_tools?language=objc. Недостатком этого подхода является то, что запуск этих инструментов возможен только на соответствующих платформах. Поэтому он лучше всего подходит для использования в сочетании с интеграцией CMake в qsb, так как выполнение обработки шейдеров на этапе сборки приложения подразумевает знание целевой платформы и какие платформно-специфические инструменты могут быть вызваны.
Следующая схема описывает шаги, выполняемые при вызове инструмента qsb.
Основные компоненты системы обработки шейдеров Qt:
- инструмент командной строки
qsb - интеграция CMake для инструмента
qsb - QShader (часть модуля QtGui)
- QShaderBaker (часть этого модуля, библиотечный аналог инструмента
qsb)
Примечание: Начиная с Qt 6.0, API C++ считаются закрытыми. Их не рекомендуется использовать напрямую из приложений. Вместо этого используйте инструмент командной строки qsb либо напрямую, либо косвенно из проектов CMake.
Типичное использование с Qt Quick
Разработчики приложений обычно сталкиваются с необходимостью работы с настраиваемым кодом шейдеров в сценах Qt Quick, которые имеют:
- элементы ShaderEffect, или
- подклассы QQuickItem, которые используют узлы графа сцены в сочетании с настраиваемыми материалами, созданными путем наследования от QSGMaterial.
Например, рассмотрите следующий фрагмент QML:
ShaderEffect {
width: 100; height: 100
fragmentShader: "myeffect.frag.qsb"
} Здесь URL fragmentShader ссылается на файл .qsb относительно расположения файла .qml. Ожидается, что приложение будет поставлять myeffect.frag.qsb рядом с файлом .qml. Для генерации этого файла из исходного кода GLSL в стиле Vulkan (который сам по себе не обязательно должен поставляться с приложением), приложение должно использовать инструмент qsb либо напрямую, либо через CMake.
Типичное использование с Qt Quick 3D
Qt Quick 3D напрямую использует модуль Shader Tools для выполнения обработки шейдеров во время выполнения. Кроме того, он предоставляет решения для предварительной генерации шейдеров для материалов на этапе сборки, в случае если зависимость от компиляторов шейдеров и других инструментов во время выполнения нежелательна. В любом случае разработчикам не нужно работать напрямую с инструментом qsb, так как он инкапсулирован собственным фреймворком и инструментами Qt Quick 3D.
Лицензии и ссылки на источники
Qt Shader Tools доступен по коммерческим лицензиям от The Qt Company. Кроме того, он доступен по GNU General Public License, версия 3. См. Qt Licensing для получения дополнительной информации.
Кроме того, Qt Shader Tools в версии 6.1.0 может содержать модули сторонних разработчиков под следующими свободными лицензиями:
SPIRV-Cross, версия d137abeef57b2f3fdbdab0ad5590fe99a44ba546 |
Apache License 2.0 и Khronos License |
BSD 3-Clause "New" или "Revised" License, Khronos License, Apache License 2.0, GNU General Public License v3.0 или более поздняя версия с исключением Bison 2.2, NVIDIA 2002 License |
Руководства и другая информация
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-6.1/qtshadertools-index.html