将 QQuickView 渲染到 QOpenGLFramebufferObject 时缺少对象

Posted

技术标签:

【中文标题】将 QQuickView 渲染到 QOpenGLFramebufferObject 时缺少对象【英文标题】:Objects missing when rendering QQuickView into QOpenGLFramebufferObject 【发布时间】:2020-06-18 13:55:41 【问题描述】:

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

想法是在渲染之前使用连接到 beforeRendering() QQuickWindow 信号的以下插槽更改渲染目标:

void GrabWindow::beforeRendering()

  如果(!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 main 直接渲染到 QQuickView 中时,我得到了以下预期结果:

当我将此 qml main 渲染到自定义 QOpenGLFramebufferObject 中时,我得到以下结果: 黑色矩形消失,文本不再有下划线。

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

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

【问题讨论】:

【参考方案1】:

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

void GrabWindow::beforeRendering()

  如果(!fbo_)
  
        fbo_.reset(new QOpenGLFramebufferObject(size(), QOpenGLFramebufferObject::Depth));
        setRenderTarget(fbo_.data());
  

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

【讨论】:

以上是关于将 QQuickView 渲染到 QOpenGLFramebufferObject 时缺少对象的主要内容,如果未能解决你的问题,请参考以下文章

如何将 qml 文件重新加载到 QQuickView

将 QML(QQuickView) 添加到现有 UI

触摸事件未在 QQuickView 上触发

Qt:隐藏然后显示 QQuickView 防止未来的鼠标事件

避免 QQuickView 延迟 qml 加载

QQuickWidget中的组件与QQuickView中的组件行为不同