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();

の値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 を見ましたが、私の問題に似たものは何も見つかりません。

そのコードに基づくすべてのプログラムで発生するわけではないようですが、一部のプログラムでは常に発生するため、本当に混乱しています。

次に何を確認すればよいですか?

編集:

そのエラーの前に (実際にはかなり前に) 実行されていたコードを削除し始めたところ、多角形を描画する場合 (そのテクスチャとは関係なく、 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 に渡された値の 1 つがゼロであり、これは許可されていません。私が最初に使用した glGetError は、その値をゼロに設定した後だったので、バインド テクスチャにあったので、それに関連していると思いました。

それを理解するのにそんなに時間がかかったのは恥ずかしいです:-)

そして、確かに、より優れた OpenGL デバッグ ツールが必要です。どうやら GLIntercept はそれを検出できたようですが、検出できませんでした。

ご迷惑をおかけして申し訳ありません。ご協力いただきありがとうございました。

于 2012-11-12T11:20:10.713 に答える