Qt 将QQuickView渲染为QOpenGLFramebufferObject时缺少对象

Qt 将QQuickView渲染为QOpenGLFramebufferObject时缺少对象,qt,opengl,qml,Qt,Opengl,Qml,我正在尝试使用此问题中给出的方法捕获qml图形缓冲区: 其想法是在渲染之前使用连接到beforeRendering()的以下插槽更改渲染目标 void GrabWindow::beforeRendering() { if (!fbo_) { fbo_.reset(new QOpenGLFramebufferObject( size(), QOpenGLFramebufferObject::NoAttachment) ); setRenderTarget(f

我正在尝试使用此问题中给出的方法捕获qml图形缓冲区:

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

void GrabWindow::beforeRendering() { if (!fbo_) { fbo_.reset(new QOpenGLFramebufferObject( size(), QOpenGLFramebufferObject::NoAttachment) ); setRenderTarget(fbo_.data()); } } 当我将此qml main直接渲染到QQuickView中时,我得到了以下预期结果:


当我将此qml main渲染为自定义QOpenGLFramebufferObject时,我得到了以下结果:
黑色矩形消失,文本不再加下划线。 如果我将根矩形的颜色设置为透明,问题似乎就解决了。 看起来根矩形隐藏了一些对象


这两种渲染方式之间是否有任何差异可以解释此问题?

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

void GrabWindow::beforeRendering() { if (!fbo_) { fbo_.reset(new QOpenGLFramebufferObject( size(), QOpenGLFramebufferObject::Depth) ); setRenderTarget(fbo_.data()); } } void GrabWindow::beforeRendering()之前 { 如果(!fbo_) { 重置(新的QOpenGLFramebufferObject(size(),QOpenGLFramebufferObject::Depth)); setRenderTarget(fbo_u2;.data()); } } 由于深度管理不好,我的一些对象被其他对象隐藏

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