Qt Инструменты шейдеров
Введение
Модуль Qt Инструменты шейдеров опирается на экосистему открытого кода SPIR-V, как описано на веб-сайте Khronos SPIR-V по адресу. Для компиляции в SPIR-V используется glslang по ссылке, а для трансляции и отражения — 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 предоставляет аналогичные инструменты по ссылке. Недостатком этого подхода является то, что запуск этих инструментов возможен только на соответствующих платформах. Поэтому этот подход лучше всего подходит для использования в сочетании с интеграцией CMake qsb, поскольку условное применение шейдеров во время сборки приложения подразумевает знание целевой платформы и то, какие платформенно-специфические инструменты могут быть вызваны.
На следующей диаграмме показаны шаги, выполняемые при вызове инструмента qsb:
Основные компоненты системы условного применения шейдеров Qt:
- инструмент командной строки
qsb - интеграция CMake для инструмента
qsb - QShader (часть модуля QtGui)
- QShaderBaker (часть этого модуля, библиотечный эквивалент инструмента
qsb)
Примечание: По состоянию на Qt 6.2 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 напрямую использует модуль Инструменты шейдеров для выполнения условного применения шейдеров во время выполнения. Кроме того, он предоставляет решения для предварительной генерации шейдеров для материалов на этапе сборки, в случае если зависимость от компиляторов шейдеров и других инструментов во время выполнения нежелательна. В любом случае разработчики не должны работать напрямую с инструментом qsb, так как он инкапсулирован в собственном фреймворке и инструментах Qt Quick 3D.
Лицензии и авторские права
Инструменты шейдеров Qt доступны по коммерческим лицензиям от The Qt Company. Кроме того, он доступен по GNU General Public License, версии 3. См. Qt Licensing для получения дополнительной информации.
Кроме того, инструменты шейдеров Qt в версии 6.2.2 могут содержать модули сторонних производителей по следующим разрешительным лицензиям:
SPIRV-Cross, версия d137abeef57b2f3fdbdab0ad5590fe99a44ba546 |
Лицензия Apache 2.0 и лицензия Khronos |
Лицензия BSD 3-Clause "New" или "Revised", лицензия Khronos, лицензия Apache 2.0, GNU General Public License v3.0 или более поздняя с исключением Bison 2.2, и лицензия NVIDIA 2002 |
Руководства и другая информация
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-6.2/qtshadertools-index.html