Объекты отсутствуют при рендеринге QQuickView в QOpenGLFramebufferObject - PullRequest
1 голос
/ 18 июня 2020

Я пытаюсь захватить буфер рисования qml, используя метод, указанный в этом вопросе: Захватить буфер рисования QML, без отображения

Идея заключалась в том, чтобы изменить цель визуализации перед визуализацией с использованием следующий слот подключен к сигналу beforeRendering () QQuickWindow:

void GrabWindow::beforeRendering()
{
  if (!fbo_)
  {
        fbo_.reset(new QOpenGLFramebufferObject( size(), QOpenGLFramebufferObject::NoAttachment) );
        setRenderTarget(fbo_.data());
  }
}

Рендеринг выполняется в объект буфера кадра, и этот объект используется для получения изображения

Проблема

При запуске этого решения у меня иногда бывает разный рендеринг между моим исходным QQuickView и моим QOpenGLFramebufferObject.

Например, у меня есть следующий main.qml :

import QtQuick 2.12

Item {
    id:root
    visible: true
    width: 640
    height: 480

    Rectangle {
        width: parent.width
        height: parent.height
        color: "gray"
    }

    Text {
        anchors.horizontalCenter: parent.horizontalCenter
        anchors.verticalCenter: parent.verticalCenter
        text: "Test Text"
        font.underline: true
        font.pixelSize: 24
    }

    Rectangle {
        anchors.horizontalCenter: parent.horizontalCenter
        anchors.verticalCenter: parent.verticalCenter

        width: 200
        height: 200
        border.width: 5
        color: "transparent"
        border.color: "black"
    }
}

Когда я визуализирую этот основной qml непосредственно в QQuickView, я получаю следующий ожидаемый результат:

Когда я визуализирую этот qml main в пользовательский объект QOpenGLFramebufferObject, я получаю следующий результат: Черный прямоугольник исчезнет, ​​и текст больше не будет подчеркнут.

Если я установлю цвет прямоугольника root на прозрачный, проблема будет решена. Похоже, что прямоугольник root скрывает некоторые объекты.

Есть ли разница между двумя способами рендеринга, которая могла бы объяснить эту проблему?

1 Ответ

1 голос
/ 22 июня 2020

Решение состоит в том, чтобы добавить буфер глубины, прикрепленный к объекту буфера кадра, используемому для рендеринга:

void GrabWindow::beforeRendering()
{
  if (!fbo_)
  {
        fbo_.reset(new QOpenGLFramebufferObject( size(), QOpenGLFramebufferObject::Depth) );
        setRenderTarget(fbo_.data());
  }
}

Некоторые из моих объектов были скрыты другими из-за плохого управления глубиной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...