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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top