我试图将以前的项目移植到新的Qt5OpenGL类。我想使用FBO渲染到纹理。以前的代码使用了我附加到FBO on-demand的多个纹理。所以,我会附加一个特定的纹理对象,执行渲染,附加另一个纹理并执行不同的操作,并将输出渲染到新附加的纹理,等等。

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

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

至于 texture()takeTexture(), ,我没有看到他们的返回值如何使用新的类。

有帮助吗?

解决方案

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

等。

其他提示

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

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

因此,请继续关注未来Qt版本的更改日志。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top