OK, First off, my apologies for posting what seems like a really basic problem, but I’ve done a lot of searches and I just can’t seem to find the answer I’m looking for.
My problem is that I want to transfer integer data from a fragment shader to the CPU, but I can’t seem to read the data correctly.
Rendering to the texture from the fragment shader using an FBO works fine. I can display the FBO’s texture to the screen and everything looks good.
But when I read the values in the buffer, they are not what I would expect.
I set up the texture like this:
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GL_BGRA, GL_UNSIGNED_BYTE, NULL);
For testing, my fragment shader looks like this:
void main()
{
gl_FragColor.b = 100.0/255.0;
gl_FragColor.g = 10.0/255.0;
gl_FragColor.r = 1.0/255.0;
gl_FragColor.a = 100.0/255.0;
}
And the code that reads the data:
glBufferData(GL_PIXEL_PACK_BUFFER, width * height * 4 * sizeof(float), NULL, GL_STREAM_READ);
glReadPixels(0, 0, width, height, GL_BGRA, GL_FLOAT, 0);
float* buffer = (float* )glMapBuffer(GL_PIXEL_PACK_BUFFER, GL_READ_ONLY);
My results are:
buffer[0] = 0.15294118
buffer[1] = 0.015686275
buffer[2] = 0.00000000
buffer[3] = 0.76078439
repeats for every 4 floats.
Obviously, I’m doing something wrong… I’m just not sure what.
All I really want to do is write an integer (less than 255, so 8-bits is enough precision) to each channel (RGBA) in the fragment shader and read it back on the CPU. If I could write and read explicit bits this would seem a lot easier, but I’m not sure how to do that in GLSL.
Thanks in advance for any help or a link to how I can figure this out.