さて、なぜ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を使用する方法を知っている人はいますか?実際には別の質問として投稿するかもしれません。
あなたが言うように、GLEWは「必須」ではありません。 glcorearb.hヘッダー、またはそのようなものを使用できます。ただし、何らかの関数とリンクする場合は、ターゲットプラットフォームに存在する必要があります。存在しないと、プログラムが起動しません。 GLEWやその他のユーザーは、まさにそれを処理します。つまり、GL関数に直接リンクするのではなく、初期化フェーズの後に関数ポインターを取得します。これにより、実行時にどの拡張機能が存在し、どの機能を使用できるかを確認できます。
移植性に役立つ唯一のことは、関数ポインタを取得することです。これは、wglGetProcAddress/glxGetProcAddressであり、AppleOSに類似しています。いいえ、そうではありません。ただし、使用可能なGL拡張機能の種類はさまざまです。
GLEWは、好みのGL初期化ライブラリとのタッチポイントを必要としません-GLコンテキストを作成した後にglewInitを呼び出すだけです。
正しく初期化するには、OpenGLコンテキストを作成する必要がありますおよびwglMakeCurrent()
を呼び出す前にglewInit();
を呼び出す必要があります
これをケルト人の答えのコメントに入れますが、どうしたらいいのかわかりません。