Question

J'essaie de porter un projet précédent vers les nouvelles classes Qt5 OpenGL.Je souhaite effectuer un rendu sur une texture à l'aide d'un FBO.Le code précédent utilisait plusieurs textures que j'attachais au FBO à la demande.Ainsi, j'attacherais un certain objet de texture, effectuerais le rendu, attacherais une autre texture et effectuerais une opération différente et rendrais la sortie à la texture nouvellement attachée, et ainsi de suite.

Je me demandais comment procéder en utilisant les classes Qt5 OpenGL.Par exemple, je n'arrive pas à comprendre comment joindre un certain QOpenGLTexture s'opposer à un QOpenGLFrameBufferObject afin que je puisse lui rendre compte.Je peux voir qu'il y a un texture() méthode et un takeTexture() méthode.Mais ils renvoient tous les deux simplement l’identifiant de texture.Aussi, comment puis-je changer l’unité de texture active ?Par exemple, je souhaite échantillonner deux textures dans mon programme de shader.Je dois donc lier deux textures à des unités de texture différentes.

Pour clarifier, le principal problème que je rencontre avec la nouvelle API est que je ne vois aucune méthode dans QOpenGLFrameBufferObject cela renverrait un QOpenGLTexture objet.Il n'y a que le toImage() méthode et le texture() et takeTexture() méthodes.Je suppose que je pourrais juste construire un QOpenGLTexture en utilisant le QImage retour de toImage().Mais je ne suis pas sûr que ce soit efficace.

Pour ce qui est de texture() et takeTexture(), je ne vois pas comment leurs valeurs de retour peuvent être utilisées en utilisant les nouvelles classes.

Était-ce utile?

La solution

Oui, QOpenGLFrameBufferObject est antérieur à QOpenGLTexture et en tant que tel, il n'utilise ni n'expose QOpenGLTexture.Il devrait être ajouté, mais en réalité, QOpenGLFBO devrait simplement être réécrit pour prendre en charge plusieurs pièces jointes.

En dehors de cela, quel est le problème lors de l'utilisation manuelle des appels GL ?

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

etc.

Autres conseils

J'ai ajouté une demande de fonctionnalité au bugtracker Qt pour prendre en charge plusieurs cibles de rendu (MRT) pour QOpenGLFramebufferObject.Il est actuellement en cours et il semble que seule la révision du code soit en attente.

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

Restez donc à l'écoute des journaux de modifications des futures versions de Qt.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top