Desidero disegnare un singolo elemento nella scena QtQuick utilizzando chiamate OpenGL non elaborate. Ho deciso di adottare l'approccio suggerito in this question.Problema con il disegno di un oggetto Qml con chiamate OpenGL non elaborate
Ho creato una voce di rapida Qt derivanti da QQuickFramebufferObject
ed esposti a QML come Renderer
: (il codice si basa su esempio Qt: Scene Graph - Rendering FBOs) File
class FboInSGRenderer : public QQuickFramebufferObject {
Q_OBJECT
public:
Renderer *createRenderer() const;
};
fonte:
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();
}
In Qml Lo uso come segue:
import QtQuick 2.4
import SceneGraphRendering 1.0
Rectangle {
width: 400
height: 400
color: "purple"
Renderer {
id: renderer
anchors.fill: parent
}
}
I wa s in attesa di vedere che ha reso "X" riempirà tutta la scena, ma invece ho ottenere il risultato presentati qui di seguito:
Altri esperimenti sembrano confermare che ha attirato forma ha sempre la sua dimensione (larghezza/altezza) diviso da 2.
Ho anche verificato che il parametro size
in createFramebufferObject
ha il valore corretto.
L'esame dei documenti mi ha portato alla proprietà textureFollowsItemSize
nella classe QQuickFramebufferObject
, ma per impostazione predefinita è true
.
Sto facendo qualcosa di sbagliato o dovrei considerare questo comportamento come Qt bug?
Non so QQuick, ma OpenGL e non vedo che hai impostato sia una macchina fotografica (proiezione o modelview) o un viewport. Se si utilizza la fotocamera opengl predefinita, guarda verso il basso l'asse Z negativo. Quindi, quando disegno il quadrante positivo x e y, mi aspetterei che il risultato che mostri (ricorda, a occhio aperto è sottosopra). Per eseguire il rendering di alcuni elementi 2D in un framebuffer, impostare una videocamera orto in direzione z e un glViewport con limiti [0,0] a [pixel_width, pixels_height] ad esempio. – Thomas
Ho usato il tuo codice - nel mio caso la cosa verde viene visualizzata una sola volta. Perché? – Pietrko