Chcę narysować pojedynczy element w scenie QtQuick za pomocą nieprzetworzonych wywołań OpenGL. Postanowiłem zastosować podejście sugerowane w this question.Problem z rysowaniem elementu Qml z surowymi wywołaniami OpenGL
Stworzyłem QT Szybki pozycję wynikającą z QQuickFramebufferObject
i wystawia go do QML jak Renderer
: (kod jest oparty na Qt przykład: Scene Graph - Rendering FBOs) Plik
class FboInSGRenderer : public QQuickFramebufferObject {
Q_OBJECT
public:
Renderer *createRenderer() const;
};
źródło:
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();
}
W Qml Używam go w następujący sposób:
I wa s spodziewając się zobaczyć, które nadają „X” wypełni całą scenę, ale zamiast tego pojawia się wynik przedstawiony poniżej:
Inne eksperymenty wydają się potwierdzać, że zwrócił kształt ma zawsze to rozmiar (szerokość/wysokość) podzielony przez 2.
Sprawdziłem również, czy parametr size
w createFramebufferObject
ma poprawną wartość.
Przeglądanie dokumentów doprowadziło mnie do właściwości textureFollowsItemSize
w klasie QQuickFramebufferObject
, ale domyślnie jest to true
.
Czy robię coś złego, czy też powinienem uważać to zachowanie za błąd Qt?
nie wiem QQuick, ale OpenGL i nie widzę, że masz ustawione albo kamerę (projekcja lub modelview) lub rzutni. Jeśli używasz domyślnej kamery OpenGL, spogląda ona w dół ujemnej osi Z. Tak więc, podczas rysowania dodatniego kwadratu x i y oczekiwałbym rezultatu, który pokazałeś (pamiętaj, że w opengl y jest do góry nogami). Aby wyrenderować niektóre elementy 2d w buforze ramki, ustawię kamerę orto w kierunku z i glViewport z zakresem [0,0] na [pixels_width, pixels_height] na przykład. – Thomas
Użyłem twojego kodu - w moim przypadku zielona rzecz jest wyświetlana tylko raz. Dlaczego? – Pietrko