Multitexturização usando QOpenGLTexture e QOpenGLFrameBufferObject
Pergunta
Estou tentando portar um projeto anterior para as novas classes Qt5 OpenGL.Quero renderizar uma textura usando um FBO.O código anterior utilizava várias texturas que anexei ao FBO sob demanda.Então, eu anexaria um determinado objeto de textura, executaria a renderização, anexaria outra textura e executaria uma operação diferente e teria a saída renderizada para a textura recém-anexada e assim por diante.
Eu queria saber como faria isso usando as classes Qt5 OpenGL.Por exemplo, não consigo descobrir como anexar um determinado QOpenGLTexture
opor-se a um QOpenGLFrameBufferObject
para que eu possa renderizar a ele.Posso ver que há um texture()
método e um takeTexture()
método.Mas ambos apenas retornam o ID da textura.Além disso, como posso alterar a unidade de textura ativa?Por exemplo, quero obter amostras de duas texturas em meu programa de shader.Então, preciso vincular duas texturas a unidades de textura diferentes.
Para esclarecer, o principal problema que estou tendo com a nova API é que não vejo nenhum método QOpenGLFrameBufferObject
isso retornaria um QOpenGLTexture
objeto.Existe apenas o toImage()
método e o texture()
e takeTexture()
métodos.Acho que poderia simplesmente construir um QOpenGLTexture
usando o QImage
voltou de toImage()
.Mas não tenho certeza se isso seria eficiente.
Quanto a texture()
e takeTexture()
, não vejo como seus valores de retorno podem ser usados com as novas classes.
Solução
Sim, QOpenGLFrameBufferObject é anterior a QOpenGLTexture e, como tal, não usa nem expõe QOpenGLTexture.Deveria ser adicionado, mas na verdade, QOpenGLFBO deveria ser apenas reescrito para suportar vários anexos.
Além disso, qual é o problema de usar chamadas GL manualmente?
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.
Outras dicas
Adicionei uma solicitação de recurso ao bugtracker Qt para oferecer suporte a vários destinos de renderização (MRT) para o QOpenGLFramebufferObject.Atualmente está em andamento e parece que apenas a revisão do código está pendente.
https://bugreports.qt.io/browse/QTBUG-39235
Portanto, fique atento aos logs de alterações das versões futuras do Qt.