13

私はopenglでプログラミングする方法を学ぼうとしており、このチュートリアルを使用しています。チュートリアル1は正常に動作し、チュートリアル2はリターン1でクラッシュします。

これで失敗します:

GLuint VertexArrayID;
glGenVertexArrays(1, &VertexArrayID);
glBindVertexArray(VertexArrayID);

具体的には:

glGenVertexArrays(1, &VertexArrayID);

助言がありますか?また、関連しているが解決されていないOpenGL、FreeGlut、およびGlewがglGenVertexArrays呼び出しでクラッシュする

4

3 に答える 3

19

このスレッドを読んだ後、呼び出しているようです

glewExperimental = GL_TRUE; 
glewInit();

問題を解決します。glewExperimental hereを読むと、それは言う

GLEW は、サポートされている拡張機能に関する情報をグラフィックス ドライバーから取得します。ただし、実験的またはプレリリースのドライバーは、標準メカニズムを介して利用可能なすべての拡張機能を報告しない場合があり、その場合、GLEW はサポートされていないと報告します。この状況を回避するには、glewInit() を呼び出す前に glewExperimental グローバル スイッチを GL_TRUE に設定してオンにします。これにより、有効なエントリ ポイントを持つすべての拡張機能が公開されます。

それが glGenVertexArrays でどのように役立つかはよくわかりませんが、試してみる価値はあります

于 2012-11-26T03:36:34.497 に答える
0

nvidia GPU と GLEW で OpenGL 4.3 を使用しても、このトリックは機能します。

この修正を使用して、第 8 版 4.3 の第 1 章から「Our First Program: A Detailed Discussion」を実行することができました。

コメントアウト

glewExperimental = GL_TRUE; 

未処理の例外が発生するため、これが問題であると確信しています。コードに追加し直すと、プログラムは期待どおりに実行されます。

元の回答から何が新しいかを明確にするために回答を更新します。

[1] 元の回答の日付が 2 年以上前のものであったことに注意してください。そのため、OpenGL の新しいバージョンでもこれが当てはまることを確認しました。Web 上の OpenGL サンプル コードの主な問題は、チュートリアル コンテンツが古くなっていることです。これはまだ機能する可能性がありますが、ベスト プラクティスまたは最もパフォーマンスの高いパスとは見なされません。元の回答を読んだとき、私の考えは次のとおりでした。

「うーん、しかしこれは 2 年前のものです... GLEW はまだ更新されておらず、この回答は古くなっていますか?」ということで、読者は 2014 年 9 月 13 日の時点でそれが事実であることがわかります。

[2] OpenGL Programmer's Guide の非常に単純な最初の例を実行しようとする多くの読者を期待していますが、この修正なしでは実行できません。本の名前を含めることで、Web 検索でこの回答が表示されることを願っています。

[3] すべてのプラットフォームでテストしたわけではありません。

于 2014-09-13T19:46:08.837 に答える