我想使用原生OpenGL调用在QtQuick场景中绘制单个项。我决定采取这篇问题中建议的方法。我创建了一个从
QQuickFramebufferObject
派生的Qt Quick项,并将其作为Renderer
暴露给QML:(代码基于Qt示例:Scene Graph - Rendering FBOs)class FboInSGRenderer : public QQuickFramebufferObject {
Q_OBJECT
public:
Renderer *createRenderer() const;
};
原始文件:
class LogoInFboRenderer : public QQuickFramebufferObject::Renderer {
public:
LogoInFboRenderer() { }
void render() {
int width = 1, height = 1;
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glColor4f(0.0, 1.0, 0.0, 0.8);
glBegin(GL_QUADS);
glVertex2f(0, 0);
glVertex2f(width, 0);
glVertex2f(width, height);
glVertex2f(0, height);
glEnd();
glLineWidth(2.5);
glColor4f(0.0, 0.0, 0.0, 1.0);
glBegin(GL_LINES);
glVertex2f(0, 0);
glVertex2f(width, height);
glVertex2f(width, 0);
glVertex2f(0, height);
glEnd();
update();
}
QOpenGLFramebufferObject *createFramebufferObject(const QSize &size) {
QOpenGLFramebufferObjectFormat format;
format.setAttachment(QOpenGLFramebufferObject::CombinedDepthStencil);
format.setSamples(4);
return new QOpenGLFramebufferObject(size, format);
}
};
QQuickFramebufferObject::Renderer *FboInSGRenderer::createRenderer() const {
return new LogoInFboRenderer();
}
在Qml中,我使用它如下:
import QtQuick 2.4
import SceneGraphRendering 1.0
Rectangle {
width: 400
height: 400
color: "purple"
Renderer {
id: renderer
anchors.fill: parent
}
}
我原本希望看到渲染的 "X" 填满整个场景,但实际上我得到了下面呈现的结果:
其他试验似乎证实了绘制的形状始终具有其大小(宽度/高度)除以2的尺寸。
我还检查了 createFramebufferObject
中的 size
参数是否具有正确的值。
查阅文档后,我发现在 QQuickFramebufferObject
类中有一个名为textureFollowsItemSize
的属性,默认情况下设置为true
。
我是做错了什么还是应该将这种行为视为Qt的错误?