QGLFramebufferObject浮点纹理

Posted

技术标签:

【中文标题】QGLFramebufferObject浮点纹理【英文标题】:QGLFramebufferObject floating point texture 【发布时间】:2012-10-13 12:45:14 【问题描述】:

我需要使用 GL_FLOAT 作为浮点计算的内部格式渲染到帧缓冲区对象。我知道如何使用原生 OpenGL 调用来实现这一点,例如:

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, width, height,
             0, GL_RGBA, GL_FLOAT, NULL);

为了使用QPainter 渲染到FBO,需要QGLFramebufferObject。 但是,QGLFramebufferObject 不允许设置类型,只能设置纹理的内部格式和格式(在我的情况下用于颜色附件)。

在 Qt 4.8 中,有没有办法在 QGLFramebufferObject 中使用浮点精度?

我知道我可以以某种方式修补和重新编译 Qt,但这很麻烦而且不是很优雅。 我还考虑编写自己的 FramebufferObject 类,但必须从 QPaintDevice 派生并提供自定义 QPaintEngine。这不是一个好的解决方案,因为 Qt 显然有一个绘图引擎,但它无法访问。

【问题讨论】:

【参考方案1】:

内部格式是唯一制作纹理浮点的东西。例如:

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width, height,
         0, GL_RGBA, GL_FLOAT, NULL);

不是浮点纹理。它是每个分量 8 位的无符号归一化纹理。因为这就是GL_RGBA8 的意思。

所以只需将QGLFramebufferObject 的内部格式设置为可用的浮点格式之一。

【讨论】:

非常感谢!这在 opengl 文档中并不清楚。

以上是关于QGLFramebufferObject浮点纹理的主要内容,如果未能解决你的问题,请参考以下文章

Android GLES 2.0:帧缓冲渲染到半浮点纹理适用于某些设备,而不是其他设备

CUDA PTX f32.f32 纹理读取

如何在opengl中正确升级纹理?

将绑定到 FBO 的纹理复制到另一个 OpenGL 上下文

通过表面写入 CUDA 中的浮点 OpenGL 纹理

在 QGLFrameBufferObject 中绘制