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

Posted

技术标签:

【中文标题】为啥调用 glLoadIdentity() 后出现 1282 错误?【英文标题】:Why I get a 1282 error after glLoadIdentity() is invoked?为什么调用 glLoadIdentity() 后出现 1282 错误? 【发布时间】:2013-10-23 08:52:11 【问题描述】:

代码:

 int err = glGetError();  // err = 0

 glMatrixMode(GL_TEXTURE);
 err = glGetError();      // err = 0

 glLoadIdentity();
 err = glGetError();      // err = 1282

GL_INVALID_OPERATION 当前状态不允许指定的操作。有问题的命令被忽略,除了设置错误标志外没有其他副作用。

当我收到错误时,我使用 gDEBugger 检查 openGL 的状态。

GL_CURRENT_RASTER_POSITION_VALID=TRUE
GL_CURRENT_RASTER_TEXTURE_COORDS=N/A
GL_CURRENT_TEXTURE_COORDS=N/A
GL_PROJECTION_STACK_DEPTH=1
GL_TEXTURE_1D=FALSE
GL_TEXTURE_2D=FALSE
GL_TEXTURE_GEN_Q=N/A
GL_TEXTURE_GEN_R=N/A
GL_TEXTURE_GEN_S=N/A
GL_TEXTURE_GEN_T=N/A
GL_TEXTURE_MATRIX=N/A
GL_TEXTURE_STACK_DEPTH=N/A
GL_TEXTURE_BINDING_1D=0
GL_TEXTURE_BINDING_2D=0
GL_TEXTURE_BINDING_3D=0
GL_TEXTURE_ENV_MODE=GL_MODULATE
GL_TEXTURE_ENV_COLOR=0, 0, 0, 0
GL_ACTIVE_TEXTURE=GL_TEXTURE11
GL_CLIENT_ACTIVE_TEXTURE=GL_TEXTURE0
GL_MAX_TEXTURE_UNITS=4
GL_ACTIVE_TEXTURE_ARB=GL_TEXTURE11
GL_CLIENT_ACTIVE_TEXTURE_ARB=GL_TEXTURE0
GL_MAX_TEXTURE_UNITS_ARB=4

我不知道哪里错了。为什么不能简单的操作?

【问题讨论】:

您甚至不应该再使用glMatrixMode()glLoadIdentity(),它们已被弃用。 @Vallentin 我知道,但我必须考虑旧版本的兼容性。 您仍然可以在旧版本的 OpenGL 中创建和使用自己的矩阵堆栈。 【参考方案1】:

来自文档:

如果执行 glLoadIdentity,则会生成 GL_INVALID_OPERATION 在 glBegin 的执行和相应的执行之间 glEnd.

我想这就是原因。

【讨论】:

我不认为这是我的问题的原因。但是当我在使用 glMatrixMode(GL_TEXTURE) 之前调用 glActiveTexture() 时,错误就消失了。我不知道为什么。【参考方案2】:

立即模式以及 OpenGL 端的矩阵处理已被弃用。即使您使用 glMatrixMode,您也应该得到相同的错误。使用 wglCreateContextAttribsARB 切换到 OpenGL 2.1 版对我有用,尽管我读过 cmets 说它不能保证它在将来会起作用。你必须从一开始就做自己的矩阵微积分和 VBO。

【讨论】:

以上是关于为啥调用 glLoadIdentity() 后出现 1282 错误?的主要内容,如果未能解决你的问题,请参考以下文章

Qt 5.9 - 由于不推荐调用 glLoadIdentity 导致 0x0 异常

为啥我的 IIS7 应用程序池在从 ASP.NET 页面调用的 DLL 中出现异常后关闭?

为啥片段恢复后再次调用onLoadFinished?

为啥我的贝宝 api 调用失败并出现错误版本不支持?

为啥在禁用 webdav 后,在本地工作的 WebApi 的 DELETE 请求上出现 405 方法不允许错误?

通俗解释glLoadIdentity(),glPushMatrix(),glPopMatrix()的作用