Я хочу нарисовать один элемент в сценарии QtQuick, используя необработанные вызовы OpenGL. Я решил использовать подход, предложенный в этом вопросе.
Я создал элемент Qt Quick, полученный из QQuickFramebufferObject
и выставил его QML как Renderer
: (код основан на примере Qt: Сцена График - рендеринг 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.
Я также проверил, что параметр size
в createFramebufferObject
имеет правильное значение.
Взгляд в документы привел меня к свойству textureFollowsItemSize
в классе QQuickFramebufferObject
, но по умолчанию он установлен на true
.
Я делаю что-то неправильно или должен ли я рассматривать это поведение как ошибку Qt?