2

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

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

澄清一下,我在使用新 API 时遇到的主要问题是我没有看到任何QOpenGLFrameBufferObject会返回QOpenGLTexture对象的方法。只有toImage()方法texture()takeTexture()方法。我想我可以QOpenGLTexture使用QImage返回的 from构造一个toImage()。但我不确定这是否有效。

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

4

2 回答 2

7

是的,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

等等

于 2014-08-01T09:22:04.833 回答
0

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

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

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

于 2015-06-16T09:46:34.577 回答