PDA

View Full Version : Render offscreen & glReadPixels



art-ganseforth
04-03-2016, 10:10 AM
Hi there,

i've some problems, with glReadPixels. The function where it appears should create a small thumbnail-image with only a few pixels of width and height from a bigger texture. So at first, the texture is renderd offscreen to a temporary texture of the image-size and the the data shold be copied, where i use wxWidgets image-class (wxImage) to store the imagedata. The wxImage-class has a method to get a pointer to the image-data. Copying image-data to a texture works like this:

glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, W, H, 0, GL_RGB, GL_UNSIGNED_BYTE, (GLuint*)wxImagePointer->GetData());

Unfortuately i can't get it otherwise around. The image has wrong colors with:
"glReadPixels(0,0, w,h-1, GL_RGB, GL_UNSIGNED_BYTE, dst->GetData());" and with
"glReadPixels(0,0, w-1,h-1, GL_RGB, GL_UNSIGNED_BYTE, dst->GetData());" colors ar okay but image shers to left.

Here ist the code of the function. The class clsBuffer is used to store the large texture.


clsBuffer *clsBuffer::RenderImage (wxImage *dst) {

int w = dst->GetWidth(); int h = dst->GetHeight();

int MipMapMode = GL_LINEAR;

GLuint tmpTex;
glGenTextures (1, &tmpTex);
glBindTexture (GL_TEXTURE_2D, tmpTex);
glTexImage2D (GL_TEXTURE_2D, 0, GL_RGB, w, h, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);

GLuint FBO=0;
glGenFramebuffers(1, &FBO);
glBindFramebuffer(GL_FRAMEBUFFER, FBO);
glBindTexture(GL_TEXTURE_2D, tmpTex);

glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + 0, GL_TEXTURE_2D, tmpTex, 0);

glViewport (0, 0, (GLint)w, (GLint)h);

Render2D(MipMapMode);

glBindTexture (GL_TEXTURE_2D, tmpTex);

glReadPixels(0,0, w-1,h-1, GL_RGB, GL_UNSIGNED_BYTE, dst->GetData());

glBindFramebuffer (GL_FRAMEBUFFER, 0);
glActiveTexture (GL_TEXTURE0);
glDeleteFramebuffers(1, &FBO);
glDeleteTextures (1, &tmpTex);

return this;
}


Note, that the function calld with "Render2D(MipMapMode);" obviously works. because it is used for other renderings also.

Any ideas what the problem might be?



Kind regards,
Frank

GClements
04-03-2016, 12:44 PM
The image has wrong colors with:
"glReadPixels(0,0, w,h-1, GL_RGB, GL_UNSIGNED_BYTE, dst->GetData());" and with
"glReadPixels(0,0, w-1,h-1, GL_RGB, GL_UNSIGNED_BYTE, dst->GetData());" colors ar okay but image shers to left.

Try setting the pack and unpack alignments to 1 with glPixelStore(). The default alignment is 4 bytes.

GL_UNPACK_ALIGNMENT affects glTexImage2D(), while GL_PACK_ALIGNMENT affects glReadPixels().