整个窗口的 glReadPixels (OpenGL)

Posted

技术标签:

【中文标题】整个窗口的 glReadPixels (OpenGL)【英文标题】:glReadPixels for entire windows (OpenGL) 【发布时间】:2017-01-21 21:04:44 【问题描述】:

我想在 OpenGL 上保存窗口的所有 RGB 值。 并想将值检查为“int”(因为我必须使用它) 我尝试使用 for 循环按每个像素保存它,它可以工作。 但是,如果我尝试一次 glReadpixels,它无法检查。有什么问题?

此代码有效。 (正确保存像素 RGB,我可以使用 cout 进行检查)

int width = 50;
int height = 50;
for(int i=0; i<height; i++)

    for(int j=0; j<width; j++)
    
        unsigned char pick_col[3];
        glReadPixels(j , i , 1 , 1 , GL_RGB , GL_UNSIGNED_BYTE , pick_col);
        cout << (int)pick_col[0] << " " << (int)pick_col[1] << " " << (int)pick_col[2] << endl;
    

但是这段代码不起作用。 (像素数组中有奇怪的值。有几个值是正确的)

GLubyte pixelarray[width*height*3]; 
glReadPixels(0, 0, width, height, GL_RGB, GL_UNSIGNED_BYTE, pixelarray);

for(int i=0; i<height; i++)

    for(int j=0; j<width; j++)
    
        cout << (int)pixelarray[i*width*3 + j*3] << " " (int)pixelarray[i*width*3 + j*3 +1] << " " << (int)pixelarray[i*width*3 + j*3+2] << endl;
    
    cout << endl;

【问题讨论】:

确保GL_PACK_ALIGNMENT 设置正确 【参考方案1】:

我解决了问题。应该是GL_RGBA和4通道数组

GLubyte pixelarray[width*height*4]; 
glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, pixelarray);

for(int i=0; i<height; i++)

    for(int j=0; j<width; j++)
    
        cout << (int)pixelarray[i*width*4 + j*4] << " "     (int)pixelarray[i*width*4 + j*4 +1] << " " << (int)pixelarray[i*width*4 + j*4+2]     << endl;
    
    cout << endl;

【讨论】:

好吧。使用 RGB 也可以,只要您设置正确的包对齐方式...

以上是关于整个窗口的 glReadPixels (OpenGL)的主要内容,如果未能解决你的问题,请参考以下文章

纹理不填充图形 - OpenGL

glReadPixels 为空时如何生成屏幕截图?

screenshot() 给出:ImportError: cannot import name glReadPixels error in kivy

如何在不同的线程上调用 glReadPixels?

glReadPixels 移动坐标与缩放

为啥 glreadpixels 仅在某些情况下有效?