我正在尝试使用此问题中给出的方法来捕获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中时,我得到了以下预期结果:
如果将根矩形的颜色设置为透明,则该问题似乎已解决。 看起来根矩形隐藏了一些对象。
两种渲染方式之间有什么区别可以解释这个问题吗?
答案 0 :(得分:1)
解决方案是在用于渲染的帧缓冲区对象上添加一个深度缓冲区:
void GrabWindow::beforeRendering() { if (!fbo_) { fbo_.reset(new QOpenGLFramebufferObject( size(), QOpenGLFramebufferObject::Depth) ); setRenderTarget(fbo_.data()); } }
由于深度管理不善,我的一些对象被其他人隐藏了。