我正在使用一个简单的DLL插件,在其中调用glReadPixels返回屏幕上的像素。在DLL中调用该函数时,它无法工作并出现错误1282 (GL_INVALID_OPERATION)

我决定将代码作为控制台EXE程序运行,但错误仍然存​​在。

我究竟做错了什么?我正在将Windows 10与Retina屏幕一起使用,我的代码如下:

int x2 = GetSystemMetrics(SM_CXSCREEN);
int y2 = GetSystemMetrics(SM_CYSCREEN);
GLvoid *imagePixelsArray = malloc((x2 *x2)*(y2* y2)*4);
glReadPixels(0, 0,x2,y2, GL_RGBA, GL_UNSIGNED_BYTE, imagePixelsArray);
cout << "ERROR is " << glGetError() << endl;


我使用x2 *x2(y2* y2)是因为我正在使用Retina屏幕。删除那个也不能解决问题。

最佳答案

我正在工作一个简单的DLL插件,在这里我调用glReadPixels以返回屏幕上的像素。


您要截图吗?您的代码段看起来像您尝试的那样。这是关于OpenGL glReadPixels的内容:

您无法使用glReadPixels截屏!

直到包括Windows-XP在内,某些OpenGL实现都具有以下行为:如果您创建了一个没有背景画笔集的全屏窗口,并且创建了OpenGL上下文并使其成为当前上下文,则实际上可能会由于这些图形而获得屏幕截图驱动程序不会初始化窗口的帧缓冲区,从而将屏幕内容保留为您可以抓取的“垃圾”。

但是,这本质上是未定义的行为,glReadPixels被定义为仅交付使用OpenGL创建的像素。

从Windows Vista开始,Windows已合成,不再共享公共的屏幕帧缓冲区,并且这种创建屏幕截图的怪异方式不再起作用。对于MacOS-X和X11,它从来没有以这种方式工作过,甚至在进行合成之前,它常常是行不通的。

关于c++ - glReadPixels函数返回错误1282(GL_INVALID_OPERATION),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37149068/

10-13 04:37