Qt RHI (Rendering Hardware Interface) это новая обёртка (абстрагирующий слой) поверх 3D API разных разработчиков ПО:
—
Metal (macOS и iOS, Apple)
—
Direct 3D 12 (Windows 10, Microsoft)
—
Vulkan (Android и Linux, Google
и непойми кто)
Совместимость с
OpenGL тоже останется, но как-то внутри.
Эта обёртка впервые появилась в
Qt 5.14, затем Qt 5.15 LTS и официально будет стандартной подсистемой для 3D-графики в Qt 6.
Реализация интерфейса находится в библиотеке QtGUI.
Для того, чтобы задействовать подсистему в Qt 5.14+ надо определить пару переменных окружения (QSG_RHI=1 QSG_RHI_BACKEND=vulkan),
или вызывать в main() специальную функцию API — QQuickWindow::setSceneGraphBackend(???).
Программы для графического сопроцессора (они называются "шейдеры"), надо писать заранее и компилировать в
SPIR-V.
Чтобы понять как это, надо гуглить слова "glslang" (GLSL->SPIR-V) и "SPIRV-Cross".
Получается файл, внутри которого лежат программы на разных языках для разных графических API.
Этот файл засовывают в ресурсы, а потом в коде грузят ресурс в C++ объект и передают в функции API.
А рантайм потом выбирает подходящую.
Вопросы у меня такие:
1) можно ли рисовать в различных местах экрана разными ядрами CPU? (т.е. чтобы шейдеры загружались в многопоточном режиме)
2) что делать если графическая видеокарта двухпроцессорная? Как использовать разные сопроцессоры?
3) что делать, если в машине несколько видеокарт (к разным мониторам)?
4) как узнавать, какие мониторы подключены и где на них располагаются окна?
5) какая библиотека оборачивает это всё для использования в C# (желательно для Avalonia)
ЭФ>> в многопоточном режиме
Z> в Qt вроде один поток занимается сбором
Ну понятно, что меньше одного — никак. Даёт ли мне ваш ответ какую-нибудь информацию,
которую я не знал ранее?
Z> Обычно в ней шейдерных процессоров намного больше,
Z> например в nvidia 2060 — 1920 шейдерных процессоров
Не в ней, а в графическом процессоре.
Z>В смысле двупроцессорная?
В прямом смысле. На плате два графических процессора.
Radeon HD 4870 X2 — На ней два GPU, в каждом 800 шейдерных юнитов. Конкретно это плата старая, но
ничего не мешает таким быть новым, а тут вопрос принципа.
ЭФ>>3) что делать, если в машине несколько видеокарт (к разным мониторам)?
Z>Зависит от того что вы хотите сделать
Удобный пользовательский интерфейс под Linux, в частности тащение окна с монитора на монитор.
Была раньше Xinerama, да где она теперь, после прихода randr?
ЭФ>>4) как узнавать, какие мониторы подключены и где на них располагаются окна?
Z> У QQuickWindow есть mapToGlobal/mapFromGlobal и у каждого QQuickView есть
Z> "attached" свойство Screen
Спасибо, надо будет посмотреть.