web-dev-qa-db-ja.com

GLEWは何をし、なぜそれが必要なのですか?

さて、なぜGLEWが必要なのかはすでにわかっていますが、ある程度までです。

おそらくバージョン3.0以降の最新のOpenGLのものを使用している場合、および/またはコアプロファイルを使用している場合は、コンパイルなしでglGenVertexArraysなどのエラーが宣言されていないため、GLEWが必要です。

そのため、GLEWは、おそらく使用したい最新のOpenGL関数を含む少しのバックグラウンド作業を行います。

それとは別に、それは他に何かしますか?また、それはどのように機能しますか。

例として、それはクロスプラットフォームのコンパイルを改善しますか? (たとえば、LinuxからWindowsまたはOS Xに移行する場合、コードの変更が少なくて済みますか?

グラフィックハードウェアの「クロスプラットフォーム性」も向上しましたか?たとえば、OSを含む2台の同一のコンピューターがあったとします。プログラムは、1つのシステムでOpenGL4.3コマンドを使用してコンパイルされます。他のシステムにOpenGL3.3のみをサポートするグラフィックカードまたはドライバーがある場合、GLEWはそれを支援しますか? (OpenGLの古いバージョン用にシェーダーをコンパイルしているのではないでしょうか?)

ですから、GLEWが何をするのか、それがどのように行われるのか、私には実際にはわからないことがわかるでしょう。

最後にもう1つ。 GLFWでGLEWを使用する方法を知っている人はいますか?実際には別の質問として投稿するかもしれません。

24
user3728501

あなたが言うように、GLEWは「必須」ではありません。 glcorearb.hヘッダー、またはそのようなものを使用できます。ただし、何らかの関数とリンクする場合は、ターゲットプラットフォームに存在する必要があります。存在しないと、プログラムが起動しません。 GLEWやその他のユーザーは、まさにそれを処理します。つまり、GL関数に直接リンクするのではなく、初期化フェーズの後に関数ポインターを取得します。これにより、実行時にどの拡張機能が存在し、どの機能を使用できるかを確認できます。

移植性に役立つ唯一のことは、関数ポインタを取得することです。これは、wglGetProcAddress/glxGetProcAddressであり、AppleOSに類似しています。いいえ、そうではありません。ただし、使用可能なGL拡張機能の種類はさまざまです。

GLEWは、好みのGL初期化ライブラリとのタッチポイントを必要としません-GLコンテキストを作成した後にglewInitを呼び出すだけです。

13
keltar

正しく初期化するには、OpenGLコンテキストを作成する必要がありますおよびwglMakeCurrent()を呼び出す前にglewInit();を呼び出す必要があります

これをケルト人の答えのコメントに入れますが、どうしたらいいのかわかりません。

6
tamato