我生成这样的纹理:
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
- 调用后返回glTexImage2D
,glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT)
在我附加纹理后返回GL_FRAMEBUFFER_COMPLETE_EXT
我还没有与glClampColorARB(...)
混淆......但是:)
GL_RGBA16F_ARB
- 纹理需要我没有给出的任何特殊处理吗?我很难过,因为GL_RGBA16
... :(
编辑:当使用GL_RGBA16F_ARB
时,我尝试渲染到屏幕的第一帧不能成功。在我看来,我应该在某处收到错误消息..?
编辑:通过检查ShadowIce的工作代码示例,我发现如果我更改了FBO上的深度缓冲区,问题就会消失,并且glRenderBufferStorageEXT(...)
{ {1}}是第二个参数,而不是GL_DEPTH_COMPONENT24
。我不知道为什么这有效,但显然它确实有效。
另外,如果我在那里进行相反的替换,ShadowIce的代码会像我一样。
答案 0 :(得分:4)
设置带浮动纹理的帧缓冲区应该没什么特别的。我会检查一些事情:
修改强>
我写了一个应该有用的小示例应用程序,也许这有帮助。我只在windows上测试过,所以对于linux你可能需要稍微修改一下:link
答案 1 :(得分:1)
GL_HALF_FLOAT_ARB可能作为类型而不是GL_FLOAT。