在 C# 中,在 Esri ArcMap 动态显示(即时模式)的 OpenGL 上下文中,我尝试创建纹理:
GL.glEnable(GL.GL_TEXTURE_2D);
uint[] textures = new uint[1];
GL.glBindTexture(1, textures[0]);
uint error = GL.glGetError();
的值为error
1281(无效值)。
我已经检查过 - 它不在 glBegin/glEnd 调用之间,并且上下文是有效的。我也曾经GLIntercept
检查调用和错误,但它似乎给了我错误的否定(我将完整的调用列表与错误进行比较,并且错误只是不匹配 - 只有在 glBegin 之前调用 glEnd之类的东西,而完整的函数列表显示从来没有发生过这样的事情)。
我怀疑是驱动问题。我在 Win7 64(应用程序是 32 位)上运行 ATI Radeon 2400 Pro。我使用的 ESRI 版本是 9.3.1 sp1。
我用谷歌搜索了很多,甚至查看了http://www.opengl.org/wiki/Common_Mistakes但我找不到任何与我的问题相似的东西。
它似乎并没有发生在所有基于该代码的程序中,但它经常发生在一些程序中,所以我真的很困惑。
接下来我应该检查什么?
编辑:
我开始消除在该错误之前运行的代码(实际上是很久以前),并发现如果在绘制多边形时(与该纹理无关的多边形,并且使用glVertexPointer
and绘制glDrawArrays
,根本没有纹理相关),我glLineWidth
在绘制该多边形之前删除了找到的那个,绑定纹理时我没有收到错误。
现在我知道这很愚蠢,而且没有任何意义,而且这要么是驱动程序中的一个大问题,要么是我对 OpenGL 的理解中的一个大问题,但我不知道是哪一个 :-)
我对消除非常小心,它实际上只是该特定功能中的那一行:
GL.glDisable(GL.GL_TEXTURE_2D);
GL.glPushMatrix();
GL.glLoadIdentity();
GL.glLineWidth(someWidthParameter); // <-- The only line I comment.
GL.glEnableClientState(GL.GL_VERTEX_ARRAY);
GL.glTranslate(...);
GL.glScale(...);
GL.glVertexPointer(...);
GL.glDrawArrays(...)
GL.glDisableClientState(GL.GL_VERTEX_ARRAY);
GL.glPopMatrix();
GL.glEnable(GL.GL_TEXTURE_2D);
所以现在我比以前更困惑......有什么想法吗?