使用QOpenGLTexture和QOpenGLFrameBufferObject进行多纹理化

时间:2014-08-01 00:47:11

标签: c++ qt opengl qt5 qtopengl

我正在尝试将以前的项目移植到新的Qt5 OpenGL类。我想使用FBO渲染到纹理。之前的代码使用了多个纹理,我按需附加到FBO。所以,我会附加一个纹理对象,执行渲染,附加另一个纹理并执行不同的操作,并将输出渲染到新附加的纹理,依此类推。

我想知道如何使用Qt5 OpenGL类进行此操作。例如,我无法弄清楚如何将某个QOpenGLTexture对象附加到QOpenGLFrameBufferObject,以便我可以渲染它。我可以看到有texture()方法和takeTexture()方法。但他们都只返回纹理ID。另外,如何更改活动纹理单元?例如,我想在我的着色器程序中从两个纹理中进行采样。所以,我需要将两个纹理绑定到不同的纹理单元。

为了澄清,我对新API的主要问题是我在QOpenGLFrameBufferObject中看不到任何会返回QOpenGLTexture对象的方法。只有toImage()方法以及texture()takeTexture()方法。我想我可以使用QOpenGLTexture返回的QImage构建toImage()。但我不确定这是否有效。

至于texture()takeTexture(),我看不到如何使用新类来使用它们的返回值。

2 个答案:

答案 0 :(得分:5)

是的,QOpenGLFrameBufferObject早于QOpenGLTexture,因此它不使用或公开QOpenGLTexture。应该添加它,但实际上,应该重写QOpenGLFBO以支持多个附件。

除此之外,手动使用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

答案 1 :(得分:0)

我向Qt bugtracker添加了一个功能请求,以支持QOpenGLFramebufferObject的多个渲染目标(MRT)。它目前正在进行中,似乎只有代码审查待决。

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

所以请继续关注未来Qt版本的更改日志。