Frage

Ich versuche, ein früheres Projekt auf die neuen Qt5-OpenGL-Klassen zu portieren.Ich möchte mit einem FBO eine Textur rendern.Der vorherige Code verwendete mehrere Texturen, die ich bei Bedarf an das FBO anhänge.Ich würde also ein bestimmtes Texturobjekt anhängen, das Rendering durchführen, eine andere Textur anhängen und einen anderen Vorgang ausführen und die Ausgabe in die neu angehängte Textur rendern lassen und so weiter.

Ich habe mich gefragt, wie ich das mit den Qt5-OpenGL-Klassen machen soll.Ich kann zum Beispiel nicht herausfinden, wie man ein bestimmtes anhängt QOpenGLTexture Einspruch gegen a QOpenGLFrameBufferObject damit ich es rendern kann.Ich kann sehen, dass es eine gibt texture() Methode und a takeTexture() Methode.Aber beide geben nur die Textur-ID zurück.Wie kann ich außerdem die aktive Textureinheit ändern?Ich möchte beispielsweise zwei Texturen in meinem Shader-Programm abtasten.Ich muss also zwei Texturen an verschiedene Textureinheiten binden.

Zur Klarstellung: Das Hauptproblem, das ich mit der neuen API habe, besteht darin, dass ich darin keine Methode sehe QOpenGLFrameBufferObject das würde a zurückgeben QOpenGLTexture Objekt.Es gibt nur die toImage() Methode und die texture() Und takeTexture() Methoden.Ich schätze, ich könnte einfach eine konstruieren QOpenGLTexture Verwendung der QImage zurückgekehrt von toImage().Aber ich bin mir nicht sicher, ob das effizient wäre.

Wie für texture() Und takeTexture(), Ich sehe nicht, wie ihre Rückgabewerte mit den neuen Klassen verwendet werden können.

War es hilfreich?

Lösung

Ja, QOpenGLFrameBufferObject ist älter als QOpenGLTexture und verwendet oder macht QOpenGLTexture daher nicht verfügbar.Es sollte hinzugefügt werden, aber eigentlich sollte QOpenGLFBO nur umgeschrieben werden, um mehrere Anhänge zu unterstützen.

Abgesehen davon: Was ist das Problem bei der manuellen Verwendung von GL-Aufrufen?

GLuint textureId = fbo->texture();
glActiveTexture(GL_TEXTURE4);
glBindTexture(GL_TEXTURE_2D, textureId);

glActiveTexture(GL_TEXTURE9);
glBindTexture(GL_TEXTURE_3D, anotherTexture);

QOpenGLTexture *yetAnother = getTexture();
yetAnother->bind(2);

program->setUniformValue("samplerForTheFBOTexture", GL_TEXTURE4 - GL_TEXTURE0);
program->setUniformValue("my3dSampler", GL_TEXTURE9 - GL_TEXTURE0);
program->setUniformValue("anotherSampler", 2);
// or use layout (binding = ) in GLSL

usw.

Andere Tipps

Ich habe dem Qt-Bugtracker eine Funktionsanfrage hinzugefügt, um mehrere Renderziele (MRT) für das QOpenGLFramebufferObject zu unterstützen.Es ist derzeit in Bearbeitung und es scheint, dass nur die Codeüberprüfung aussteht.

https://bugreports.qt.io/browse/QTBUG-39235

Bleiben Sie also auf dem Laufenden für Änderungsprotokolle zukünftiger Qt-Versionen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top