1

我生成这样的纹理:

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_RGBA16GL_RGBA16F_ARB,纹理似乎停止工作。我没有尝试渲染到 FBO/纹理棒,当我使用纹理时,它包含随机垃圾。(很多紫色,事实证明)如果我收到一条提示可能有问题的错误消息,这不会那么令人沮丧,但我似乎找不到。换句话说,在-call 之后返回,并glGetError()在我附加纹理时返回0glTexImage2DglCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT)GL_FRAMEBUFFER_COMPLETE_EXT

我还没有搞砸glClampColorARB(...)......但是:)

  1. 我是否忘记在我没有想到的地方/方式中检查错误?
  2. -textures 是否GL_RGBA16F_ARB需要我没有给予的任何特殊处理?
  3. 还有什么可能是错的吗?

我很难过,因为一切都很顺利GL_RGBA16...... :(

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

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

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

4

2 回答 2

4

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

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

编辑:

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

我写了一个应该可以工作的小示例应用程序,也许这会有所帮助。我只在windows上测试过,所以对于linux你可能需要稍微改变一下:link

于 2009-03-12T22:35:10.090 回答
1

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

于 2009-03-13T08:12:56.737 回答