我生成这样的纹理:
GLuint id;
glGenTextures(1, &id);
glBindTexture(GL_TEXTURE_2D, id);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexImage2D(
GL_TEXTURE_2D, 0,
GL_RGBA16,
//GL_RGBA16F_ARB, //< Won't work
256, 256, 0, GL_RGBA, GL_FLOAT, NULL
);
glBindTexture(GL_TEXTURE_2D, 0);
我将它附加到帧缓冲区对象 (FBO) 以进行渲染。当我将内部格式设置为 GL_RGBA16
时,所有这一切都非常有效。但是,我需要更高的动态范围,并且认为 GL_RGBA16F_ARB
可能会成功。
不幸的是,如果我在上面给出的代码中将 GL_RGBA16
替换为 GL_RGBA16F_ARB
,纹理似乎停止工作。我尝试渲染到 FBO/纹理棒的任何东西,当我使用它包含随机垃圾的纹理时。 (很多紫色,事实证明)如果我收到一条错误消息提示可能出了什么问题,但我似乎找不到,这就不会那么令人沮丧了。换句话说,glGetError()
在 glTexImage2D
调用后返回 0
,而 glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT)
返回 GL_FRAMEBUFFER_COMPLETE_EXT
当我附加了纹理
我还没有弄乱 glClampColorARB(...)
... :)
- 我是否忘记以我没有想到的地方/方式检查错误?
GL_RGBA16F_ARB
- 纹理是否需要任何我没有给予的特殊处理?- 还有其他可能出错的地方吗?
我很困惑,因为使用 GL_RGBA16
一切都很顺利... :(
编辑:当使用 GL_RGBA16F_ARB
时,我尝试渲染到屏幕的第一帧没有成功。在我看来,我应该在某处收到一条错误消息......?
编辑:通过检查 ShadowIce 的工作代码示例,我发现如果我更改我的 FBO 上的深度缓冲区并提供 glRenderBufferStorageEXT(. ..)
GL_DEPTH_COMPONENT24
作为它的第二个参数,而不是 GL_DEPTH_COMPONENT16
。我不知道为什么这有效,但显然它确实有效。
此外,如果我在那里进行相反的替换,ShadowIce 的代码会像我的一样中断。
最佳答案
设置带有 float 纹理的帧缓冲区应该没有什么特别的事情要做。我会检查一些事情:
- 在调用 glCheckFramebufferStatusEXT 之前,FBO 绑定(bind)和绘制/读取缓冲区设置是否正确?也可以在绘制之前尝试对其进行测试。
- 使用具有特定清晰颜色的简单 glClear 之后,纹理看起来是否正常?如果是,则您的着色器(如果您使用任何着色器)或绘制到 FBO 的方式可能有问题。
- 您的驱动程序是最新的吗?问题是否仍然存在于具有不同硬件的 PC 上?
- GL_RGBA32F_ARB 怎么样?
编辑:
- 检查您的帧缓冲区和纹理的 ID,同时检查纹理 ID 是否与附加到您的 fbo 的 ID 匹配(使用 glGetFramebufferAttachmentParameteriv)。通常我会猜想,如果它与 RGBA 纹理一起工作,一切都很好,但随机数据(尤其是紫色)是一个很好的迹象,表明没有任何内容写入纹理或未正确清除。
我已经编写了一个小的示例应用程序,它应该可以工作,也许有帮助。我只在 Windows 上测试过,所以对于 Linux,您可能需要稍微更改一下:link
关于c++ - 使用 GL_RGBA16F_ARB 纹理时,它只包含废话,但我没有收到任何错误消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/640095/