当使用GL_RGBA16F_ARB纹理时,它只包含废话,但我没有收到错误消息

时间:2009-03-12 19:14:54

标签: 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()0 - 调用后返回glTexImage2DglCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT)在我附加纹理后返回GL_FRAMEBUFFER_COMPLETE_EXT

我还没有与glClampColorARB(...)混淆......但是:)

  1. 我忘了在一个我没想过的地方/路上检查错误吗?
  2. GL_RGBA16F_ARB - 纹理需要我没有给出的任何特殊处理吗?
  3. 还有什么可能是错的吗?
  4. 我很难过,因为GL_RGBA16 ... :(

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

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

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

2 个答案:

答案 0 :(得分:4)

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

  1. 在调用glCheckFramebufferStatusEXT之前,是否绑定了FBO并且绘制/读取缓冲区设置正确?也请在绘制之前尝试测试它。
  2. 在具有特定清晰颜色的简单glClear之后纹理看起来是否正常?如果是,您的着色器可能会出现问题(如果您使用的话)或您绘制到FBO的方式。
  3. 您的驱动程序是最新的吗?在具有不同硬件的PC上问题是否仍然存在?
  4. GL_RGBA32F_ARB怎么样?
  5. 修改

    1. 检查帧缓冲区和纹理的ID,还要检查纹理ID是否与附加到fbo的纹理ID匹配(使用glGetFramebufferAttachmentParameteriv)。通常情况下,如果它适用于RGBA纹理,我会猜测一切正常,但随机数据(特别是紫色)是一个好迹象,表明没有任何内容被写入纹理,或者没有正确清除。
    2. 我写了一个应该有用的小示例应用程序,也许这有帮助。我只在windows上测试过,所以对于linux你可能需要稍微修改一下:link

答案 1 :(得分:1)

GL_HALF_FLOAT_ARB可能作为类型而不是GL_FLOAT。