【问题标题】:Multi-texturing using QOpenGLTexture and QOpenGLFrameBufferObject使用 QOpenGLTexture 和 QOpenGLFrameBufferObject 的多重纹理
【发布时间】:2014-08-01 00:47:11
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: c++ qt opengl qt5 qtopengl


    【解决方案1】:

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

    等等

    【讨论】:

    • 感谢您的解释和示例。我认为有一种方法可以仅使用 Qt5 OpenGL 包装类干净地完成此操作,而无需将它们与手动 GL 调用混合。显然这是目前唯一的方法,Qt 的类仍然缺少一些功能。
    • 我正在准备一个新的 FBO 类(暴露 QOpenGLTexture),但这将是 Qt 5.5 材料...
    • 那太好了。期待在未来的版本中看到这一点。再次感谢,您的帮助很大。
    【解决方案2】:

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

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

    敬请关注未来 Qt 版本的更改日志。

    【讨论】:

    • 拥有这个功能真是太好了。感谢您的更新!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 2015-09-06
    • 2012-09-10
    • 2015-03-11
    • 2016-10-13
    相关资源
    最近更新 更多