glReadPixels存储x,y值

w00*_*w00 2 c++ opengl glut

我正在尝试使用glReadPixels存储像素数据,但到目前为止,我设法一次只存储一个像素.我不确定这是否可行.我目前有这个:

unsigned char pixels[3];
glReadPixels(50,50, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, pixels);
Run Code Online (Sandbox Code Playgroud)

将它存储在数组中的好方法是什么,以便我可以获得如下值:

pixels[20][50][0]; // x=20 y=50 -> R value
pixels[20][50][1]; // x=20 y=50 -> G value
pixels[20][50][2]; // x=20 y=50 -> B value
Run Code Online (Sandbox Code Playgroud)

我想我可以简单地把它放在一个循环中:

for ( all pixels on Y axis )
{
    for ( all pixels in X axis )
    {
        unsigned char pixels[width][height][3];
        glReadPixels(x,y, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, pixels[x][y]);
    }
}
Run Code Online (Sandbox Code Playgroud)

但我觉得必须有一个更好的方法来做到这一点.但我确实需要我的数组就像上面描述的代码一样.那么for循环的想法是好的,还是有更好的方法?

Rob*_*ani 5

glReadPixels只需从屏幕左下角的顺序返回字节R, G, B, R, G, B, ...(根据您的设置GL_RGB),直到右上角.从OpenGL文档:

glReadPixels从帧缓冲区返回像素数据,从左下角位于(x,y)的像素开始,从位置数据开始返回客户端内存.在将像素数据放入客户端存储器之前,几个参数控制像素数据的处理.这些参数使用三个命令设置:glPixelStore,glPixelTransfer和glPixelMap.此参考页面描述了对这些命令指定的大多数但不是所有参数的glReadPixels的影响.

调用glReadPixels数千次的开销很可能需要花费相当多的时间(取决于窗口大小,如果循环花费1-2秒,我不会感到惊讶).

建议您只调用glReadPixels一次并将其存储在大小的字节数组中(width - x) * (height - y) * 3.从那里,您可以引用像素的组件位置,data[(py * width + px) * 3 + component]其中包含您想要查找的像素位置,px以及py像素component的R,G或B组件.

如果你绝对必须在一个三维数组中,你可以编写一些代码来重新调整glReadPixels调用后的1d数组.