QOpenGLFramebufferObject 绑定纹理
Posted
技术标签:
【中文标题】QOpenGLFramebufferObject 绑定纹理【英文标题】:QOpenGLFramebufferObject bind texture 【发布时间】:2015-09-21 18:02:26 【问题描述】:这简直把我逼疯了!
我已经通过
创建了我的 fboQOpenGLFramebufferObjectFormat format;
format.setAttachment(QOpenGLFramebufferObject::CombinedDepthStencil);
format.setMipmap(false);
format.setSamples(4);
format.setTextureTarget(GL_TEXTURE_2D);
format.setInternalTextureFormat(GL_RGBA32F_ARB);
qfbo=new QOpenGLFramebufferObject(QSize(w,h),format);
好的,它似乎正在工作,Qt 没有声明这一点。
问题是我需要 QOpenGLFramebufferObject 作为读/写,写它似乎很容易,只是 qfbo.bind() 使它工作,问题是我无法绑定它的纹理,如果我问它关于 GLuint处理它在两种模式下总是返回 0:
qDebug()<<qfbo->texture();
qDebug()<<qfbo->takeTexture();
显然我的意图是像这样单独绑定纹理:
glBindTexture(GL_TEXTURE_1D, fbo->texture());
对此有什么建议吗?我已经用谷歌搜索了很长时间没有运气:(
我忘了说如果我不使用 .setsamples(4);得到一个 !=0 GLuit 但完全是黑色的。
【问题讨论】:
当我查看texture()
的文档时,它说:“如果使用了多重采样帧缓冲区对象,那么从这个函数返回的值将是无效的。”所以我的猜测是,如果你不使用setsamples(4)
它的工作,但绘图只是黑色。doc.qt.io/qt-5/qopenglframebufferobject.html#texture
是的,正如我所说,没有它它会返回 0 作为 GLuint,但使用它 (setsamples(4)) 它会返回 0 作为 GLuint
【参考方案1】:
如果您使用多重采样,则不会分配纹理,而是使用多重采样渲染缓冲区。
您需要创建另一个匹配维度的非多重采样 FBO,并使用 blitFramebuffer
将多重采样数据解析为单次采样。
然后,您将拥有可以绑定的纹理(绑定到 2D
目标,而不是绑定到 1D
!)。如果这个纹理仍然是全黑的,在你的代码上运行 apitrace 看看你做错了什么。
【讨论】:
以上是关于QOpenGLFramebufferObject 绑定纹理的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 QOpenGLFrameBufferObject 进行阴影映射?