paw*_*wel 11 opengl qt qml qt-quick qtquick2
我想使用原始OpenGL调用在QtQuick场景中绘制单个项目.我决定采取这个问题的建议方法.
我创建了一个Qt Quick项目,QQuickFramebufferObject并将其公开给QML Renderer:(代码基于Qt示例:场景图 - 渲染FBO)
class FboInSGRenderer : public QQuickFramebufferObject {
Q_OBJECT
public:
Renderer *createRenderer() const;
};
Run Code Online (Sandbox Code Playgroud)
源文件:
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();
}
Run Code Online (Sandbox Code Playgroud)
在Qml中我使用它如下:
import QtQuick 2.4
import SceneGraphRendering 1.0
Rectangle {
width: 400
height: 400
color: "purple"
Renderer {
id: renderer
anchors.fill: parent
}
}
Run Code Online (Sandbox Code Playgroud)
我期待看到渲染的"X"将填满整个场景,但我得到的结果如下:

其他实验似乎证实,画出形状总是它的大小(宽度/高度)除以2.
我还检查了该size参数createFramebufferObject是否具有正确的值.
查看docs导致我textureFollowsItemSize在QQuickFramebufferObject课堂上的属性,但它默认设置为true.
我做错了什么或者我应该将此行为视为Qt错误?
绘制的矩形是您期望大小的一半,因为默认坐标范围是 [-1, 1],而不是代码假设的 [0, 1]。如果你想使用 [0, 1] 尺度,那么你应该适当设置投影矩阵:
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2106 次 |
| 最近记录: |