Pregunta

Estoy intentando portar un proyecto anterior a las nuevas clases Qt5 OpenGL.Quiero renderizar una textura usando un FBO.El código anterior utilizaba múltiples texturas que adjunté al FBO bajo demanda.Entonces, adjuntaría un determinado objeto de textura, realizaría el renderizado, adjuntaría otra textura y realizaría una operación diferente y haría que la salida se renderizara en la textura recién adjunta, y así sucesivamente.

Me preguntaba cómo haría esto usando las clases Qt5 OpenGL.Por ejemplo, no sé cómo adjuntar un determinado QOpenGLTexture objetar a un QOpenGLFrameBufferObject para que pueda rendirle.Puedo ver que hay un texture() método y un takeTexture() método.Pero ambos simplemente devuelven la identificación de la textura.Además, ¿cómo puedo cambiar la unidad de textura activa?Por ejemplo, quiero tomar una muestra de dos texturas en mi programa de sombreado.Entonces, necesito vincular dos texturas a diferentes unidades de textura.

Para aclarar, el principal problema que tengo con la nueva API es que no veo ningún método en QOpenGLFrameBufferObject eso devolvería un QOpenGLTexture objeto.Sólo existe el toImage() método y el texture() y takeTexture() métodos.Supongo que podría simplemente construir un QOpenGLTexture utilizando el QImage regresó de toImage().Pero no estoy seguro de si eso sería eficiente.

Como para texture() y takeTexture(), no veo cómo se pueden usar sus valores de retorno usando las nuevas clases.

¿Fue útil?

Solución

Sí, QOpenGLFrameBufferObject es anterior a QOpenGLTexture y, como tal, no utiliza ni expone QOpenGLTexture.Debería agregarse, pero en realidad, QOpenGLFBO debería simplemente reescribirse para admitir múltiples archivos adjuntos.

Aparte de esto, ¿cuál es el problema al utilizar manualmente llamadas 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.

Otros consejos

Agregué una solicitud de función al rastreador de errores de Qt para admitir múltiples objetivos de renderizado (MRT) para QOpenGLFramebufferObject.Actualmente está en progreso y parece que solo está pendiente la revisión del código.

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

Así que estad atentos a los registros de cambios de futuras versiones de Qt.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top