2012-01-21 33 views
2

我想通过使用glReadPixels存储像素数据,但到目前为止,我设法一次只存储一个像素。我不确定这是否应该走。目前,我有这样的:glReadPixels商店x,y值

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循环的想法会不错,还是有更好的方法?

回答

4

glReadPixels简单地返回顺序R, G, B, R, G, B, ...字节(根据您的GL_RGB设置)从屏幕上马上要到右上方的左下角。 From the OpenGL documentation

glReadPixels从帧缓冲器返回的像素数据,与 其左下角是在位置(x,y)的像素,在开始进入客户 存储器中,起始位置的数据。在将像素数据放入客户端内存之前,有几个参数控制像素数据的处理。 这些参数用三个命令设置:glPixelStore, glPixelTransfer和glPixelMap。该参考页面描述了大多数glReadPixels上的 效果,但不是这三个命令指定的所有参数 。

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

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

如果你绝对需要必须有它在一个三维数组中,你可以写一些代码来重新排列glReadPixels调用后的1d数组。

0

你可以做什么是声明在结构和使用操作简单的一个维数组超载,方便标符号

struct Pixel2d 
{ 
    static const int SIZE = 50; 
    unsigned char& operator()(int nCol, int nRow, int RGB) 
    { 
     return pixels[ (nCol* SIZE + nRow) * 3 + RGB]; 
    } 

    unsigned char pixels[SIZE * SIZE * 3 ]; 
}; 

int main() 
{ 

    Pixel2d p2darray; 
    glReadPixels(50,50, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, &p.pixels); 

    for(int i = 0; i < Pixel2d::SIZE ; ++i) 
    { 
     for(int j = 0; j < Pixel2d::SIZE ; ++j) 
     { 
      unsigned char rpixel = p2darray(i , j , 0); 
      unsigned char gpixel = p2darray(i , j , 1); 
      unsigned char bpixel = p2darray(i , j , 2); 
     } 
    } 
} 

在这里,你正在阅读一个50 * 50像素的一次拍摄,并使用operator()(int nCol, int nRow, int RGB)运营商提供所需的便利。出于性能方面的考虑,您不想让太多glReadPixels电话

1

如果你定义像素阵列,如:这样的:

unsigned char pixels[MAX_Y][MAX_X][3]; 

而且你会喜欢这个访问:

pixels[y][x][0] = r; 
pixels[y][x][1] = g; 
pixels[y][x][2] = b; 

然后你就可以用一个读取像素glReadPixels调用:

glReadPixels(left, top, MAX_Y, MAX_X, GL_RGB, GL_UNSIGNED_BYTE, pixels);