glReadPixels 函数返回错误 1282 (GL_INVALID_OPERATION)

Posted

技术标签:

【中文标题】glReadPixels 函数返回错误 1282 (GL_INVALID_OPERATION)【英文标题】:glReadPixels function returning error 1282 (GL_INVALID_OPERATION) 【发布时间】:2016-05-10 21:12:18 【问题描述】:

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

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

我做错了什么?我正在使用带有 Retina 屏幕的 Windows 10,我的代码如下:

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 屏幕。删除也没有解决问题。

【问题讨论】:

我有一个 cookie 表明您没有在有效的 GL 上下文中调用它。即使你是,十个 cookie 表示它不是对应于整个屏幕的上下文。 @JayKominek 来自 Unity 我从 OnPostRender 函数调用它,据我了解,它对其他人有用。由于它不起作用,我决定使用控制台应用程序自行测试它。你能提供一个链接或一个例子吗?如何从有效的 GL 上下文中调用它?对于否决票,我不知道为什么。 glReadPixels() 之前的wglGetCurrentContext() 是否返回NULL 以外的其他内容? @genpfault 我做了cout &lt;&lt; wglGetCurrentContext() 并得到了 00000000。这对我来说看起来像 null。你怎么看? @Programmer unity 在幕后做着各种各样的事情。如果它已初始化 GL,然后在 GL 上下文有效时运行您的代码,那么您就可以开始工作了。由于 OpenGL 的性质,不能期望完全脱离上下文的 GL 代码(在该词的非技术意义上)表现相同。在没有任何设置的情况下将其粘贴在控制台应用程序中是行不通的。 (这可能是反对票的来源。不是我。我什至没有投票结束。) 【参考方案1】:

我正在使用一个简单的 DLL 插件,我在其中调用 glReadPixels 来返回屏幕上的像素。

您要截屏吗?您的代码 sn-p 看起来像您尝试的那样。这是关于 OpenGL 的 glReadPixels:

您不能使用 glReadPixels 截屏!

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

然而,这本质上是未定义的行为,并且 glReadPixels 被定义为仅提供使用 OpenGL 创建的像素。

从 Windows Vista 开始,窗口是合成的,不再共享一个通用的屏幕帧缓冲区,这种创建屏幕截图的古怪方式不再有效。在 MacOS-X 和 X11 中,它从来没有以这种方式工作过,甚至在合成成为一件事情之前,它经常不起作用。

【讨论】:

是的,我用它来获取屏幕截图。我在 Windows 上而不是在 Mac 上这样做。这似乎对这里的其他人有用answers.unity3d.com/questions/465409/… 他们唯一遇到的问题是在 android 上运行它时,但它应该可以工作。 @Programmer answers.unity3d OP 试图从他们渲染到的纹理中读取,而不是整个屏幕。 OpenGL不能用来做包括其他窗口的全屏抓取;为此,您需要特定于操作系统的 API。 @ColonelThirtyTwo 我想我读错了。谢谢你让我知道这件事。我想这就是我要找的。​​span>

以上是关于glReadPixels 函数返回错误 1282 (GL_INVALID_OPERATION)的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL 着色器错误 1282

使用 OpenCV 处理来自 glReadPixels 的图像并将其作为纹理返回

为啥调用 glLoadIdentity() 后出现 1282 错误?

带有 glEndList() 的 OpenGL 错误 1282

OpenGL 3.3 - glDrawArrays 后的无效操作错误 (1282)

从 glReadPixels 创建 HBITMAP