Hey guys, I need to find a fast way to get the frame buffer. Using glReadPixels is taking me down to about 3 fps (only rendering a 1 triangle scene), and that will NOT be acceptable.
First, I have constants:
Screen will always be 512x512
Bitdepth will always be 32bit rgba
Platform will always be win32
Anybody have some interesting hacks? I bet there are some win32 calls I can use to make this a bit faster, but I’m not much of a win32 guy.
Machine configuration is a 550mhz P3, TNT2 AGP card.
If you’re using 6.xx drivers you should be able to get MUCH faster than that. 512x512 means you are retrieving 256K pixels, and if you’re at 3 fps, you’re getting <1 Mpixel/sec. My own benchmarks suggest you should be able to get >10 Mpixels/sec (MINIMUM) for that kind of readback if you are using 6.xx drivers, whether you’re on a TNT, TNT2, or any type of GeForce.
GL_UNSIGNED_BYTE/GL_BGRA is likely to be slightly faster than GL_UNSIGNED_BYTE/GL_RGBA, but if you’re under 1 megapixel, something else is wrong.
If you’re in a 16-bit mode, you’ll get best results with GL_UNSIGNED_SHORT_5_6_5/GL_RGB.
For reference, on my P3-700, BX, GF2 GTS, Win2K, with desktop at 32-bit, doing a 512x512 readback with type GL_UNSIGNED_BYTE and format GL_RGBA, I get 107 readbacks per second (28 Mpixels/sec). TNT2 should not be that much slower at this operation.
First, I looked at glReadPixels more carefully. It turns out that when I ask for GL_BYTE, it reads the frame buffer, converts all r, g, and b’s to FLOATS, then converts to whatever type I specified.
I changed the call to:
glReadPixels(0,0,512,512,GL_RGBA,GL_FLOAT,fbPtr);
and I get 4.1fps.
If I do the original:
glReadPixels(0,0,512,512,GL_RGBA,GL_UNSIGNED_BYTE,fbPtr);
I get 2.8fps.
Matt, using GL_BGRA_EXT gave me the same 2.8fps.
Basically, all i need is an EXACT copy of what is in video ram…just the 32 bit rgba framebuffer.
Downloading the 6.31 version now. I’ll let you know how it goes in a few minutes…er, make that half an hour. Seems we have a slow pipe between here and nvidia.