【发布时间】:2015-03-20 04:22:56
【问题描述】:
我想使用原始 OpenGL 调用在 QtQuick 场景中绘制单个项目。我决定采用this question 中建议的方法。
我创建了一个源自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 错误?
【问题讨论】:
-
我不知道 QQuick,但是 OpenGL 并且我没有看到您设置了相机(投影或模型视图)或视口。如果您使用默认的 opengl 相机,它会向下看负 z 轴。因此,当绘制正 x 和 y 象限时,我会期望您显示的结果(请记住,在 opengl 中,y 是颠倒的)。例如,要在帧缓冲区中渲染一些 2d 项目,我将在 z 方向设置一个正交相机和一个边界为 [0,0] 到 [pixels_width,pixels_height] 的 glViewport。
-
我已经使用了您的代码 - 在我的情况下,绿色的东西只呈现一次。这是为什么呢?
标签: qt opengl qml qt-quick qtquick2