使用原始OpenGL调用绘制Qml项时出现问题

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导致我textureFollowsItemSizeQQuickFramebufferObject课堂上的属性,但它默认设置为true.

我做错了什么或者我应该将此行为视为Qt错误?

Mic*_*zyk 3

绘制的矩形是您期望大小的一半,因为默认坐标范围是 [-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)