私のバージョンの Visual Studio に含まれている gl.h ヘッダー ファイルを読んでいますが、かなり古くなっているようです。
私は、GLUT やその他のミドルウェア/ユーティリティ ライブラリが、GLEW を含む汚い仕事を私に代わって行うことを望んでいません。4.0仕様の最新の機能セットを取得/クエリする理由と方法、およびGLEWの一般的な背後にある考え方について誰か詳しく説明してもらえますか?
私のバージョンの Visual Studio に含まれている gl.h ヘッダー ファイルを読んでいますが、かなり古くなっているようです。
私は、GLUT やその他のミドルウェア/ユーティリティ ライブラリが、GLEW を含む汚い仕事を私に代わって行うことを望んでいません。4.0仕様の最新の機能セットを取得/クエリする理由と方法、およびGLEWの一般的な背後にある考え方について誰か詳しく説明してもらえますか?
MSVC++ に同梱されている gl.h は、Windows に同梱されている opengl32.dll によってエクスポートされた関数のみをカバーしています。この DLL は、ほとんどの場合、実際のドライバーへのいわゆる「トランポリン」にすぎません。ただし、OpenGL の非常に古いバージョン、つまり OpenGL-1.1 のみをエクスポートします。
それを超える機能は、拡張メカニズムを介してアクセスする必要があります。
私は、GLUT やその他のミドルウェア/ユーティリティ ライブラリが、GLEW を含む汚い仕事を私に代わって行うことを望んでいません。
GLUTはGLEWとはまったく関係ありません
4.0仕様の最新の機能セットを取得/クエリする理由と方法、およびGLEWの一般的な背後にある考え方について誰か詳しく説明してもらえますか?
前述の拡張システムを介して最新の機能セットを取得します。
関数があります?glGetProcAddress
(OS 環境に応じた正確な名前、Windows の場合wglGetProcAddress
)。この関数を使用して、現在の OpenGL コンテキストの拡張機能のプロシージャへの関数ポインタを取得します(GLX では関数ポインタはすべてのコンテキストで同じですが、Windows では異なる場合があります)。
拡張機能をロードすると、次のようになります。
typedef (*OGLEXTP_SOMEEXTENSIONFUNCTION)(...)
OGLEXTP_SOMEEXTENSIONFUNCTION oglextp_glSomeExtensionFunction = NULL;
#define glSomeExtensionFunction oglextp_glSomeExtensionFunction;
struct Extensions
{
bool SomeExtensionFunction;
}
errorcode initGLExtensions(){
Extensions available;
GLubyte extensions = glGetStrings(GL_EXTENSIONS);
parse_extension_string(extensions, available);
if( available.SomeExtensionFunction ) {
oglextp_glSomeExtensionFunction = wglGwtProcAddress("glSomeExtensionFunction");
if( !oglextp_glSomeExtensionFunction )
return errorcode;
}
}
そして、すべての関数に対して、これの一括コードを作成する必要があります。誰もこれを書きたくない。そのため、GLEW の開発者は、opengl.org から拡張機能の仕様をフェッチし、拡張機能のロード全体を自動的に作成し、これを小さなライブラリにラップする一連のスクリプトを考え出しました。これにより、追加の依存関係は作成されません。
より高度な OpenGL 機能を使用する場合: GLEW を使用します。必須だからではなく、これが最も簡単な方法だからです。
GLEWを恐れないでください。まず、Nvidia OpenGL SDK のサンプルで GLEW が使用されているのを実際に見てきました。フレンドリーなライセンスを備えた信頼できるツールであることは明らかです。次に、ライブラリを静的にリンクし、依存関係として気化できます。(個人的には、ソース コードをプロジェクトに追加して #define GLEW_STATIC を実行するだけです。)
OpenGL 4.0 拡張機能にアクセスしたいですか? OpenGL 4.0 コンテキストを作成し、対応する関数をバインドするよう GLEW に依頼する必要がある場合があります。
これは、私のプロジェクトからコピーされた GLEW と GLFW のサンプルです。
...
if (!glfwInit()) {
exit(EXIT_FAILURE);
}
glfwOpenWindowHint(GLFW_OPENGL_VERSION_MAJOR, 2); // I requested OpenGL 2.1 context
glfwOpenWindowHint(GLFW_OPENGL_VERSION_MINOR, 1);
if(!glfwOpenWindow(640, 480, 8, 8, 8, 0, 24, 0, GLFW_WINDOW)) { // get OpenGL context
glfwTerminate();
exit(EXIT_FAILURE);
}
if (glewInit() != GLEW_OK) { // init glew, and bind gl* Extension functions
glfwTerminate();
exit(EXIT_FAILURE);
}
// now gl* extensions is available here
....
GLee は、OpenGL 拡張機能をロードするためのもう 1 つのライブラリであり、ソース コードを理解するのは非常に簡単で簡単です (コード ジェネレーターは別の話です)。これで、拡張機能のロードがどのように機能するかがわかります。
著者と協力して OpenGL 4.x 拡張機能のサポートを追加したため、「リリース済み」バージョンではなく、SVN トランクを使用してください。
私が GLee で気に入っているのは、使用する拡張機能のみをロードすることです。200 以上の異なる拡張機能をロードする GLEW とは対照的に、プログラムの起動が遅くなり、特に OpenGL プロファイリングが遅くなります。