I generate a texture like this:
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);
I attach it to a framebuffer object (FBO) for rendering to. All of this works like a charm when I set the internal format to GL_RGBA16
. However, I need a higher dynamic range and was thinking that GL_RGBA16F_ARB
might do the trick.
Unfortunately, if I replace GL_RGBA16
with GL_RGBA16F_ARB
in the code given above, the texture seems to stop working. Nothing I try to render to the FBO/texture sticks, and when I use the texture it contains random garbage. (A lot of purple, as it turns out) This would not be so frustrating if I had gotten an error message hinting at what might be wrong, but I can't seem to find one. In other words, glGetError()
returns 0
after the glTexImage2D
-call, and glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT)
returns GL_FRAMEBUFFER_COMPLETE_EXT
when I have attached the texture
I haven't messed with glClampColorARB(...)
... yet :)
- Have I forgotten to check for errors in a place/way that I haven't thought of?
- Do
GL_RGBA16F_ARB
-textures require any special treatment that I haven't given? - Is there anything else that might be wrong?
I'm stumped, since everything works smoothly with GL_RGBA16
... :(
EDIT: When using GL_RGBA16F_ARB
, the first frame I try to render to screen doesn't make it. Seems to me that I should be getting an error message somewhere..?
EDIT: By inspecting ShadowIce's working code example I figured out that the problems disappeared if I changed the depth buffer on my FBO, and give glRenderBufferStorageEXT(...)
GL_DEPTH_COMPONENT24
as its second parameter, rather than GL_DEPTH_COMPONENT16
. I have no idea why this works, but apparently it does work.
Also, ShadowIce's code breaks like mine if I do the opposite substitution there.