简体   繁体   中英

How to glReadPixels properly to write the data into QImage in Linux

Summary

I want to write the opengl pixels(GL_RGB) by glReadPixels to a QImage.This renders correct, but when i resize the window, it scales weird and distorts my shape(triangle).

What i tried

I tried (QImage)img.scale(width(),height(),Qt::KeepAspectRatio) but it didn't solve the problem.

Played with how i write the pixels buffer from glReadPixels to QImage but No.Didn't work.

Should i read the pixels in three buffers(GLubyte *rpixel,*gpixel,*bpixel) or on one(GLubyte **pixels)?Which one is the easiest because i will resize the array when i will resize my window(so i want dynamic arrays).

Some code

I have uploaded a minimal code recreating the bug-weird behaviour in github.Download and compile using the Qt Creator. https://github.com/rivenblades/GlReadPixelsQT/tree/master

Pictures

Here is how i wanted(it works when not resizing) 在此处输入图片说明

Here is after resizing(Weird behaviour) 在此处输入图片说明

As you can see, when resizing, the image gets splitted at right and contunues at left at probably another row.So i am guessing the size of the image is wrong(needs more width?).

By default, the start of each row of an image is assumed to be aligned to 4 bytes. This is because the GL_PACK_ALIGNMENT respectively GL_UNPACK_ALIGNMENT parameter is by default 4, see glPixelStore .
When a framebuffer is read by glReadPixels the GL_PACK_ALIGNMENT parameter is considered.

If you want to read the image in a tightly packed memory, with not alignment at the start of each line, then you've to change the GL_PACK_ALIGNMENT parameter to 1, before reading the color plane of the framebuffer:

glPixelStorei(GL_PACK_ALIGNMENT, 1);

glReadPixels(0,0,unchangable_w, unchangable_h, GL_RED, GL_UNSIGNED_BYTE, tga.rpic);
glReadPixels(0,0,unchangable_w, unchangable_h, GL_GREEN, GL_UNSIGNED_BYTE, tga.gpic);
glReadPixels(0,0,unchangable_w, unchangable_h, GL_BLUE, GL_UNSIGNED_BYTE, tga.bpic); 

If that is missed, this cause a shift effect at each line of the image, except if the length of a line of the image in bytes is divisible by 4.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM