2

私の友人と私は、C++ と OpenGL を使用するプロジェクトに取り組んでいます。「ModelObject」の C++ クラスを作成しました。各 ModelObject にはメンバー変数として Gluint vao があります。次に、ModelObject の初期化中に呼び出します。

glGenVertexArrays( 1, &vao );
glBindVertexArray( vao );

そして、初期化関数の最後に呼び出します

glBindVertexArray(0);

文脈から抜け出すこと。ここで、電車と立方体の 2 つのオブジェクトをレンダリングしようとしています。彼のマシン (Linux Mint) では、どちらも独自のテクスチャを使用して適切にレンダリングされ、vaos のオブジェクトをクエリすると、それぞれ 1 と 2 が返されます。

ただし、私のマシン (MacBook Pro) では、両方のオブジェクトが立方体としてレンダリングされます (ただし、一方は電車のテクスチャで、もう一方は立方体のテクスチャです)。それらの vaos を照会すると、0 と 0 が返されます。

実験として、glGenVertexArrays に ModelObject ごとに 5 つの vaos を作成するように指示しました。これにより、リスト 0、1、918273、8、7 (またはそれに類似したもの) が生成され、両方の ModelObject で同じリストになりました。

したがって、私が知る限り、glGenVertexArrays は、a) 有効なアドレスとして 0 を使用し、b) glDeleteVertexArray を呼び出していないにもかかわらず、呼び出しごとに同一のアドレスを生成します。彼のマシンではなく私のマシンでこれを行うのはなぜですか?どうすれば停止できますか?

4

3 に答える 3

4

お使いの GPU は OpenGL 3.0 をサポートしていますか? glviewは、エントリ ポイント glGenVertexArrays について何と言っていますか? GPU/ドライバーが VAO をサポートしていない可能性があります。

于 2012-12-13T18:08:52.543 に答える
2

VAO は OpenGL 3.0 で導入されたため、3.0 以降をサポートするコンテキストでのみ機能します。

Mac OS は、コア プロファイル コンテキストで OpenGL 3.x および 4.x のみをサポートします。デフォルトでは、OpenGL 2.1 をサポートするコンテキストが取得され、コア プロファイルで廃止され、削除されたすべてのレガシー機能が含まれます。Mac OS は、3.0 以降の機能をレガシー機能と組み合わせて使用​​できる互換性プロファイルをサポートしていません。

コア プロファイル コンテキストを作成する方法は、使用するウィンドウ システム インターフェイスによって異なります。一般的な 2 つの場合:

  • GLUT を使用する (これ自体は非推奨としてマークされていますが、現時点ではまだ機能します): にGLUT_3_2_CORE_PROFILE渡されるフラグに追加しglutInitDisplayMode()ます (詳細については、Mac OSX 10.9 での Glut の非推奨、IDE: QT Creatorを参照してください)。

  • Cocoa では、この属性/値のペアをピクセル形式の属性に追加します。

    NSOpenGLPFAOpenGLProfile, NSOpenGLProfileVersion3_2Core,
    

コア プロファイル コンテキストがあれば、問題なく動作glGenVertexArrays()glBindVertexArray()ます。これには明らかに、少なくとも OpenGL 3.x をサポートできるマシンが必要です。このページの表には、各マシンのバージョン サポートが一覧表示されています: http://support.apple.com/kb/HT5942

于 2014-09-16T13:20:59.007 に答える