Класс QSGRenderNode
Класс QSGRenderNode представляет собой набор пользовательских команд отрисовки, нацеленных на графический API, используемый в дереве сцены. Подробнее...
| Заголовок: | #include <QSGRenderNode> |
| qmake: | QT += quick |
| С тех пор: | Qt 5.8 |
| Наследует: | QSGNode |
Открытые типы
| класс | RenderState |
| перечисление | RenderingFlag { BoundedRectRendering, DepthAwareRendering, OpaqueRendering } |
| флаги | RenderingFlags |
| перечисление | StateFlag { DepthState, StencilState, ScissorState, ColorState, ..., RenderTargetState } |
| флаги | StateFlags |
Открытые функции
| QSGRenderNode() | |
| ~QSGRenderNode() | |
| virtual StateFlags | changedStates() const |
| const QSGClipNode * | clipList() const |
| virtual RenderingFlags | flags() const |
| qreal | inheritedOpacity() const |
| const QMatrix4x4 * | matrix() const |
| virtual QRectF | rect() const |
| virtual void | releaseResources() |
| virtual void | render(const RenderState *state) = 0 |
- 20 открытых функций, унаследованных от QSGNode
Подробное описание
Класс QSGRenderNode представляет собой набор пользовательских команд отрисовки, нацеленных на графический API, используемый в дереве сцены.
Документация по типам членов
перечисление QSGRenderNode::RenderingFlagфлаги QSGRenderNode::RenderingFlags
Возможные значения для битовой маски, возвращаемой функцией flags().
| Константа | Значение | Описание |
|---|---|---|
QSGRenderNode::BoundedRectRendering |
0x01 |
Указывает, что реализация render() не выполняет отрисовку за пределами области, указанной функцией rect() в координатах элемента. Такие реализации узлов могут привести к более эффективной отрисовке в зависимости от бэкенда дерева сцены. Например, программный бэкенд может продолжать использовать более оптимальный путь частичной обновления, когда все узлы отрисовки в сцене имеют этот флаг установленным. |
QSGRenderNode::DepthAwareRendering |
0x02 |
Указывает, что реализация render() соответствует ожиданиям дерева сцены, генерируя значение Z равное 0 в координатах сцены, которое затем преобразуется с помощью матриц, полученных из RenderState::projectionMatrix() и matrix(), как описано в примечаниях к render(). Такие реализации узлов могут привести к более эффективной отрисовке в зависимости от бэкенда дерева сцены. Например, пакетный OpenGL рендерер может продолжать использовать более оптимальный путь, когда все узлы отрисовки в сцене имеют этот флаг установленным. |
QSGRenderNode::OpaqueRendering |
0x04 |
Указывает, что реализация render() записывает непрозрачные пиксели для всей области, указанной функцией rect(). По умолчанию рендереры должны предполагать, что render() может также выводить полупрозрачные или полностью прозрачные пиксели. Установка этого флага может улучшить производительность в некоторых случаях. |
Тип RenderingFlags является псевдонимом для QFlags<RenderingFlag>. Он хранит результат побитового ИЛИ комбинации значений RenderingFlag.
перечисление QSGRenderNode::StateFlagфлаги QSGRenderNode::StateFlags
Тип StateFlags является псевдонимом для QFlags<StateFlag>. Он хранит результат побитового ИЛИ комбинации значений StateFlag.
Документация по функциям-членам
QSGRenderNode::QSGRenderNode()
Создает экземпляр QSGRenderNode по умолчанию.
QSGRenderNode::~QSGRenderNode()
Удаляет узел отрисовки. Производные классы должны выполнять очистку, подобную releaseResources() в этом методе.
При использовании низкоуровневого графического API дерево сцены гарантирует ожидание ЦП завершения всей работы графическим процессором, отправленной в очередь команд графического процессора дерева сцены, прежде чем узлы дерева сцены будут удалены. Поэтому нет необходимости издавать дополнительные ожидания, если реализация render() не использует дополнительные очереди команд.
См. также releaseResources().
[virtual] StateFlags QSGRenderNode::changedStates() const
Эта функция должна вернуть маску, где каждый бит представляет измененные графические состояния функцией render():
- DepthState - маска записи глубины, включение проверки глубины, функция сравнения глубины
- StencilState - маски записи трафарета, включение проверки трафарета, операции трафарета, функции сравнения трафарета
- ScissorState - включение обрезки, включение проверки обрезки
- ColorState - цвет очистки, маска записи цвета
- BlendState - включение смешивания, функция смешивания
- CullState - лицевая сторона, включение обрезки по граням
- ViewportState - область видимости
- RenderTargetState - целевой рендеринг
Функция вызывается рендерером, чтобы он мог сбросить состояния после отрисовки этого узла. Это упрощает реализацию render(), поскольку ей не нужно запрашивать и восстанавливать эти состояния.
По умолчанию функция возвращает 0, что означает, что в render() не было изменено никаких соответствующих состояний.
С API, отличным от OpenGL, соответствующие состояния — это только те, которые устанавливаются через список команд (например, OMSetRenderTargets, RSSetViewports, RSSetScissorRects, OMSetBlendFactor, OMSetStencilRef в случае D3D12), и только когда такие команды были добавлены в список команд дерева сцены, запрошенный через ресурс перечисления QSGRendererInterface::CommandList. Состояния, установленные в объектах состояния конвейера, не нужно сообщать здесь. Аналогично, параметры, связанные с вызовом отрисовки (подпись корневого объекта, кучи дескрипторов и т. д.), всегда устанавливаются повторно деревом сцены, поэтому render() может свободно их изменять.
Программный бэкенд использует QPainter и сохраняет и восстанавливает состояния до и после вызова render(). Поэтому нет необходимости сообщать об изменениях состояния из этого места.
Примечание: Эта функция может быть вызвана до render().
const QSGClipNode *QSGRenderNode::clipList() const
Возвращает текущий список обрезки.
[virtual] RenderingFlags QSGRenderNode::flags() const
Возвращает флаги, описывающие поведение этого узла отрисовки.
Реализация по умолчанию возвращает 0.
См. также RenderingFlag и rect().
qreal QSGRenderNode::inheritedOpacity() const
Возвращает текущий эффективный коэффициент непрозрачности.
const QMatrix4x4 *QSGRenderNode::matrix() const
Возвращает указатель на текущую матрицу модели-представления.
[virtual] QRectF QSGRenderNode::rect() const
Возвращает прямоугольник ограничительной области в координатах элемента для области, которую касается render(). Значение используется только тогда, когда flags() включает BoundedRectRendering, в противном случае игнорируется.
Отчет о прямоугольнике в сочетании с BoundedRectRendering особенно важен при использовании бэкенда software, так как в противном случае наличие узла rendernode в сцене вызовет обновление всего экрана, пропуская все оптимизации частичных обновлений.
Для узлов rendernodes, покрывающих всю область соответствующего QQuickItem, значением возврата будет (0, 0, item->width(), item->height()).
См. также flags().
[virtual] void QSGRenderNode::releaseResources()
Эта функция вызывается, когда все пользовательские графические ресурсы, выделенные этим узлом, должны быть освобождены немедленно. Если узел не выделяет графические ресурсы (буферы, текстуры, цели рендеринга, ограждения и т. д.) напрямую через используемый графический API, здесь ничего не нужно делать.
Невыполнение освобождения всех пользовательских ресурсов может привести к некорректному поведению в сценариях потери графического устройства на некоторых системах, так как последующая повторная инициализация графической системы может завершиться неудачей.
Примечание: Некоторые бэкэнды сцены могут не вызывать эту функцию. Поэтому ожидается, что реализации QSGRenderNode выполняют очистку как в своем деструкторе, так и в releaseResources().
В отличие от деструктора, ожидается, что render() может повторно инициализировать все необходимые ресурсы при вызове после вызова releaseResources().
С OpenGL контекст OpenGL сцены будет текущим как при вызове деструктора, так и при вызове этой функции.
[pure virtual] void QSGRenderNode::render(const RenderState *state)
Эта функция вызывается рендерером и должна отрисовать этот узел, напрямую вызывая команды в используемом в данный момент графическом API (OpenGL, Direct3D и т. д.).
Эффективную непрозрачность можно получить с помощью inheritedOpacity().
Матрица проекции доступна через state, а матрица модели-представления может быть получена с помощью matrix(). Объединённая матрица — это произведение матрицы проекции на матрицу модели-представления. Правильная укладка элементов в сцене обеспечивается матрицей проекции.
При использовании предоставленных матриц система координат для данных вершин соответствует обычным соглашениям QQuickItem: верхний левый угол — (0, 0), нижний правый угол — ширина() и высота() соответствующего QQuickItem минус единица. Например, предположим, что на вершину приходится два значения с плавающей запятой (x-y), треугольник, покрывающий половину элемента, может быть задан как (width - 1, height - 1), (0, 0), (0, height - 1) против часовой стрелки.
Примечание: QSGRenderNode предоставляется как средство для реализации пользовательских 2D или 2.5D элементов Qt Quick. Он не предназначен для интеграции истинно 3D-содержимого в сцену Qt Quick. Для этого случая лучше подойдёт QQuickFramebufferObject, QQuickWindow::beforeRendering() или аналогичные для API, отличных от OpenGL.
Информация о обрезке вычисляется до вызова функции, но не активирована. Реализации, желающие учесть обрезку, могут настроить срезку или маскирование стереотипов на основе информации в state. Некоторые бэкэнды сцены, особенно программные, не используют срезку или маскирование стереотипов. Там область обрезки предоставляется как обычная QRegion.
Для OpenGL следующие состояния устанавливаются в контексте потока рендеринга перед вызовом этой функции:
- glDepthMask(false)
- glDisable(GL_DEPTH_TEST)
- glStencilFunc(GL_EQUAL, state.stencilValue, 0xff) в зависимости от обрезки
- glScissor(state.scissorRect.x(), state.scissorRect.y(), state.scissorRect.width(), state.scissorRect.height()) в зависимости от обрезки
- glEnable(GL_BLEND)
- glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA)
- glDisable(GL_CULL_FACE)
Состояния, которые не указаны выше, но включены в StateFlags, могут иметь произвольные значения.
changedStates() должен вернуть состояния, которые изменяет эта функция. Если состояние не покрывается StateFlags, состояние должно быть установлено в значение по умолчанию в соответствии со спецификацией OpenGL. Для других API см. документацию changedStates() для получения дополнительной информации.
Примечание: Запись глубины отключена при вызове этой функции (например, glDepthMask(false) в случае OpenGL). Включение записи глубины может привести к непредсказуемым результатам в зависимости от используемого бэкенда сцены, поэтому узлы должны этого избегать.
Для API, отличных от OpenGL, вероятно, потребуется запросить определённые ресурсы API (например, графическое устройство или список/буфер команд для добавления команд). Это делается с помощью QSGRendererInterface.
См. также QSGRendererInterface и QQuickWindow::rendererInterface().
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-5.9/qsgrendernode.html