目次 - API(機能別) - ディスプレイとウィンドウ - SDL_GL_GetProcAddress

# SDL_GL_GetProcAddress

名前でOpenGLの関数を得る

## 構文

`void* SDL_GL_GetProcAddress(const char* proc)`

## 引数

proc | OpenGL関数の名前

## 戻り値

その名前のOpenGL関数へのポインタを戻す. 戻されたポインタはその関数に適したシグニチャでキャストする必要がある.

## サンプルコード

``

    typedef void (APIENTRY * GL_ActiveTextureARB_Func)(unsigned int);
    GL_ActiveTextureARB_Func glActiveTextureARB_ptr = 0;

    /* 関数のポインタを得る */
    glActiveTextureARB_ptr=(GL_ActiveTextureARB_Func) SDL_GL_GetProcAddress("glActiveTextureARB");

    /* 正しく関数を呼べるようにするのはあなたの責任である! */
    glActiveTextureARB_ptr(GL_TEXTURE0_ARB);

## 詳細

GLライブラリを実行中にSDL_GL_LoadLibrary()で読み込んだならば, 全てのGL関数はこの方法で読み出さなければならない. 通常はOpenGL拡張の関数へのポインタを読み出すために使う.

OpenGLの関数を検索するのはいくつかの難点があり, アプリケーションは特に注意を要する. それでも注意深くコーディングすれば, 環境に依存するコードなしでこれらの難点を扱うことができる.

- Windowsでは関数へのポインタはカレントコンテキストに固有である. つまりSDL_GL_GetProcAddress()を呼ぶ前にGLコンテキストを生成しカレントにする必要がある. コンテキストを再生成, または2つ目のコンテキストを生成したとき, 既に存在する関数へのポインタは全て使えないとみなす必要がある. これは(現在は)Windows固有の制限だが, 実際は多くのドライバにはこの制限はない. しかし, WGL APIのドキュメントには今でもそのように動作すると記述されていて, これを考慮しなければクラッシュすると考えるべきだ. 関数へのポインタをコピーし保存した場合, そのライフサイクルはコンテキストに従う.
- X11では, この関数が戻す関数へのポインタはあらゆるコンテキストで有効である. そしてコンテキストを生成する前でも検索できる. これは少なくともいくつかのOpenGLの実装で, 存在しない関数を検索したとき, 安全では*ない*NULLでない結果を得ることを意味する. 動作中のGLコンテキストで関数が実際に使えるか否かを, SDL_GL_ExtensionSupported()でその拡張の存在をチェックすることや, 使用中のバージョンのOpenGLでその関数が提供されているかを確認することで, 呼ぶ前に常に確認する必要がある.
- 全ての環境で, 一部のOpenGLのドライバは対応していない関数の場合はNULLを戻す. しかしその動作を期待してはならない. 拡張の存在をチェックしたが, それでもNULLを得たならば, その拡張は使えないとみなすべきだ. これはドライバのバグかもしれない. しかし, いずれにせよこの方法ならばコードは堅牢になる.
- Linux/UnixであるというだけでX11を使っているとみなしてはならない. それと置き換わる次世代のディスプレイサーバが待ち構えている. そしてそれは関数へのポインタも同様かもしれない.
- OpenGL関数へのポインタはサンプルコードのようにAPIENTRYで宣言する必要がある. これは環境に従った呼出規約であることが保障されていて, (win32で)スタック破壊の問題を避けることができる.

## バージョン

SDL 2.0.0以降

## 関連項目(関数)

SDL_GL_ExtensionSupported
SDL_GL_LoadLibrary
SDL_GL_UnloadLibrary

## SDL Wikiへのリンク

SDL_GL_GetProcAddress - SDL Wiki