在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);
所以现在我比以前更加困惑......任何想法?
答案 0 :(得分:1)
发现问题:
显然,传递给glLineWidth的值之一为零,这是不允许的。 我使用的第一个glGetError是在将值设置为零之后是绑定纹理,所以我认为它与此有关。
我很惭愧我花了很长时间才弄明白: - )
我当然需要更好的OpenGL调试工具 - 显然GLIntercept可以检测到它,但没有,但因为它是我唯一可用的工具,它必须这样做。
抱歉,我不得不打扰你们,谢谢你的帮助。