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

unsigned char pixels[3];
glReadPixels(50,50, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, pixels);

什么是将其存储在数组中的好方法,这样我就可以得到如下值:
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

我想我可以简单地将其放入循环中:
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]);
    }
}

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

最佳答案

glReadPixels只是从屏幕左下角的到右上角,以R, G, B, R, G, B, ...(基于GL_RGB的设置)的顺序返回字节。 From the OpenGL documentation:



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

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

如果绝对必须放入3维数组中,则可以在glReadPixels调用后编写一些代码来重新排列1d数组。

关于c++ - glReadPixels存储x,y值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8954071/

10-13 04:01