c++ - 使用 GL_RGBA16F_ARB 纹理时,它只包含废话,但我没有收到任何错误消息

标签 c++ c opengl fbo

我生成这样的纹理:

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(...) ... :)

  1. 我是否忘记以我没有想到的地方/方式检查错误?
  2. GL_RGBA16F_ARB - 纹理是否需要任何我没有给予的特殊处理?
  3. 还有其他可能出错的地方吗?

我很困惑,因为使用 GL_RGBA16 一切都很顺利... :(

编辑:当使用 GL_RGBA16F_ARB 时,我尝试渲染到屏幕的第一帧没有成功。在我看来,我应该在某处收到一条错误消息......?

编辑:通过检查 ShadowIce 的工作代码示例,我发现如果我更改我的 FBO 上的深度缓冲区并提供 glRenderBufferStorageEXT(. ..) GL_DEPTH_COMPONENT24 作为它的第二个参数,而不是 GL_DEPTH_COMPONENT16。我不知道为什么这有效,但显然它确实有效。

此外,如果我在那里进行相反的替换,ShadowIce 的代码会像我的一样中断。

最佳答案

设置带有 float 纹理的帧缓冲区应该没有什么特别的事情要做。我会检查一些事情:

  1. 在调用 glCheckFramebufferStatusEXT 之前,FBO 绑定(bind)和绘制/读取缓冲区设置是否正确?也可以在绘制之前尝试对其进行测试。
  2. 使用具有特定清晰颜色的简单 glClear 之后,纹理看起来是否正常?如果是,则您的着色器(如果您使用任何着色器)或绘制到 FBO 的方式可能有问题。
  3. 您的驱动程序是最新的吗?问题是否仍然存在于具有不同硬件的 PC 上?
  4. GL_RGBA32F_ARB 怎么样?

编辑:

  1. 检查您的帧缓冲区和纹理的 ID,同时检查纹理 ID 是否与附加到您的 fbo 的 ID 匹配(使用 glGetFramebufferAttachmentParameteriv)。通常我会猜想,如果它与 RGBA 纹理一起工作,一切都很好,但随机数据(尤其是紫色)是一个很好的迹象,表明没有任何内容写入纹理或未正确清除。

我已经编写了一个小的示例应用程序,它应该可以工作,也许有帮助。我只在 Windows 上测试过,所以对于 Linux,您可能需要稍微更改一下:link

关于c++ - 使用 GL_RGBA16F_ARB 纹理时,它只包含废话,但我没有收到任何错误消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/640095/

相关文章:

c++ - 我可以用 vector 构建我的网格吗 (OpenGL)

C++ AVL树旋转

microcontroller - C while 在数字范围之间循环

c - 用GCC编译时出现错误

c++ - 使用多个类、额外的预先存在的 .a 库和其他依赖项制作库

c++ - 在构造函数中使用函数 connect()

c# - 将 OpenGL 用于桌面应用程序是否合理?

.net - C++ 是否转换为 MSIL?

c++ - 运算符重载 C++

c++ - 一个点绕另一个点旋转的函数