1

を使用する宿題に問題がありますOpenGL 2.0 pipeline。問題はGL_INVALID_OPERATIONglVertexPointer.

このエラーが何であるかをオンラインで見つけることはできませんが、私が理解していることから、このエラーは を呼び出す glEnableClientState(GL_VERTEX_ARRAY)前に呼び出さないことが原因glVertexPointerです。

両方の関数を呼び出すための私のコードは次のとおりです。

glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(4, GL_DOUBLE, sizeof(vert), (void *)0);

の呼び出し前にエラーが存在するかどうかを確認し、この関数の呼び出し後まで 0 を返しますglVertexPointerglErrorエラーは別の原因で発生しているようです。この問題を引き起こす可能性のある他のシナリオは何ですか?

少し辛辣な質問で申し訳ありません。他に何を提供できるのか本当にわかりません。コードの他の部分を見る必要がある場合は、提供できるものをお知らせください。

4

1 に答える 1

4

gl___Pointer (...)対応する固定機能のクライアント配列の状態が有効になっていないという理由だけで、 GL_INVALID_OPERATIONエラーが生成されることはありません。その状態は、 のような描画呼び出しを行うときに使用されますglDrawElements (...)。配列ポインタが無効なときにこのポインタを指定してもエラーにはなりません。

ただし、次の 3 つの状況で頂点ポインタを呼び出すとエラーになります ( GL_INVALID_OPERATIONが生成されます)。

  1. 呼び出しスレッドにアクティブなレンダリング コンテキストがありません
  2. OpenGL 3.2 コア コンテキストを使用しており、頂点配列オブジェクトがバインドされていません
  3. OpenGL 3.2 コア コンテキストがあり、非推奨の関数を呼び出しています。

3.2 以降のコア コンテキストがある場合、箇条書き 2 と 3 の両方がこの特定の API 呼び出しに適用されます。頂点配列オブジェクトは、事実上、すべての頂点バッファー バインディング、配列ポインター、および描画呼び出しが関連する追加のコンテキストです。OpenGL 3.2 コアでは、頂点配列オブジェクトがバインドされていない場合、これらの関数にはコンテキストがなく、この状況は箇条書き 1 の特殊化と見なすことができます。

また、との呼び出しglVertexPointer (...)のペアの間で呼び出しを行うことも未定義の操作です。このような状況では、実装によってエラーが生成される場合と生成されない場合があります。エラーが発生した場合はGL_INVALID_OPERATIONが生成されます。これは、大部分の OpenGL API 呼び出しに適用されます。イミディエイト モードでの頂点データの指定と関係がない場合は、 と の間に属しません。glBegin (...)glEnd (...)glBegin (...)glEnd (...)

実際の API リファレンス ページ (つまりglVertexPointer (...)) では、上で概説した 3 つの状況のいずれにも言及していません。GL_INVALID_OPERATIONは、暗黙的な意味を持つGL_OUT_OF_MEMORYのようなエラーの 1 つであり、マニュアル ページで言及されていなくても、API 呼び出しのクラス全体によって生成される可能性があります。GL_INVALID_OPERATIONの最も一般的な原因についてよく理解しておく必要があります。

于 2013-11-06T00:09:08.137 に答える