Spec-Zone.ru › Qt 5.9

Класс 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.

См. также render() и rect().

перечисление 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API