1

在 C# 中,在 Esri ArcMap 动态显示(即时模式)的 OpenGL 上下文中,我尝试创建纹理:

GL.glEnable(GL.GL_TEXTURE_2D);
uint[] textures = new uint[1];
GL.glBindTexture(1, textures[0]);
uint error = GL.glGetError();

的值为error1281(无效值)。

我已经检查过 - 它不在 glBegin/glEnd 调用之间,并且上下文是有效的。我也曾经GLIntercept检查调用和错误,但它似乎给了我错误的否定(我将完整的调用列表与错误进行比较,并且错误只是不匹配 - 只有在 glBegin 之前调用 glEnd之类的东西,而完整的函数列表显示从来没有发生过这样的事情)。

我怀疑是驱动问题。我在 Win7 64(应用程序是 32 位)上运行 ATI Radeon 2400 Pro。我使用的 ESRI 版本是 9.3.1 sp1。

我用谷歌搜索了很多,甚至查看了http://www.opengl.org/wiki/Common_Mistakes但我找不到任何与我的问题相似的东西。

它似乎并没有发生在所有基于该代码的程序中,但它经常发生在一些程序中,所以我真的很困惑。

接下来我应该检查什么?

编辑:

我开始消除在该错误之前运行的代码(实际上是很久以前),并发现如果在绘制多边形时(与该纹理无关的多边形,并且使用glVertexPointerand绘制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);

所以现在我比以前更困惑......有什么想法吗?

4

1 回答 1

1

发现问题:

显然,传递给 glLineWidth 的值之一为零,这是不允许的。我使用的第一个 glGetError 是在将该值设置为零之后在绑定纹理处,所以我认为它与此有关。

我很惭愧我花了这么长时间才弄清楚:-)

而且我当然需要更好的 OpenGL 调试工具——显然 GLIntercept 可以检测到它但没有检测到,但因为它是我唯一可用的工具,所以它必须做。

对不起,我不得不打扰大家,感谢您的帮助。

于 2012-11-12T11:20:10.713 回答