glBindTexture可能由glLineWidth引起的无效值

时间:2012-11-11 14:57:39

标签: c# opengl esri

在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来检查调用和错误,但它似乎给了我错误的否定(我将完整的调用列表与错误进行比较,错误只是不匹配 - 只有像 glEnd这样的东西被调用在glBegin之前,而完整的功能列表显示没有发生过这样的事情。)

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

我已经谷歌了很多,甚至看了http://www.opengl.org/wiki/Common_Mistakes,但我找不到任何类似于我的问题。

在基于该代码的所有程序中似乎都没有发生,但它在某些程序中不断发生,所以我真的很困惑。

接下来我应该检查什么?

修改

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

所以现在我比以前更加困惑......任何想法?

1 个答案:

答案 0 :(得分:1)

发现问题:

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

我很惭愧我花了很长时间才弄明白: - )

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

抱歉,我不得不打扰你们,谢谢你的帮助。