将QQuickView渲染到QOpenGLFramebufferObject中时缺少对象

时间:2020-06-18 13:55:41

标签: qt opengl qml

我正在尝试使用此问题中给出的方法来捕获qml绘图缓冲区:Capture QML drawing buffer, without displaying

这个想法是在渲染之前使用连接到 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中时,得到以下结果:
黑色矩形消失,文本不再带下划线。

如果将根矩形的颜色设置为透明,则该问题似乎已解决。 看起来根矩形隐藏了一些对象。

两种渲染方式之间有什么区别可以解释这个问题吗?

1 个答案:

答案 0 :(得分:1)

解决方案是在用于渲染的帧缓冲区对象上添加一个深度缓冲区:

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

由于深度管理不善,我的一些对象被其他人隐藏了。