コンパイルと実行
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2021/07/17 21:15 UTC 版)
GLSLシェーダープログラムは単体のアプリケーションではない。シェーダーの実行にはOpenGL APIを利用するホストアプリケーションが必要である。ホストアプリケーションを記述する言語には、OpenGL APIをサポートする第一級言語であるC言語およびC++、あるいはWebGLをサポートするJavaScriptなどがよく利用される。 従来方式では、GLSLシェーダーはOpenGL API関数を通じて、ハードウェアベンダーの実装したデバイスドライバー上のオンラインコンパイラによって実行時にコンパイルされる。GLSLシェーダープログラムのソースコードはホストプログラム上の文字列リテラルとして記述されたり、アプリケーション実行時に外部テキストファイルなどから読み込まれたりしたものがメモリ上の文字列データとして実体化されるが、オフラインの事前コンパイル方式ではなく、あくまでドライバーにはソースコード文字列の形式で送られ、ドライバーが実行時にシェーダーのソースコードをコンパイルして「シェーダープログラムオブジェクト」を生成する。具体的な手順として、アプリケーションはまずglCreateShader()で各シェーダーステージのシェーダーオブジェクトを生成し、そのシェーダーオブジェクトに対してGLSLソースコード文字列をglShaderSource()で設定した後、glCompileShader()によってシェーダーをコンパイルする。その後、glCreateProgram()で生成したプログラムオブジェクトに対して、glAttachShader()で前述のコンパイル済みシェーダーオブジェクトを関連付け、glLinkProgram()でリンクすることで、ようやく一連のプログラマブルシェーダーパイプラインが完成する。シェーダープログラムを利用して描画するには、描画命令を発行する前にglUseProgram()で現在のOpenGLコンテキストにプログラムオブジェクトをバインドしておく必要がある。 シェーダープログラムのコンパイルやリンクは時間のかかる処理であり、アプリケーション初期化のボトルネックとなりうるため、直近のソースコード文字列に対応するコンパイル結果はドライバー側でキャッシュされる実装になっていることも多い。なお、OpenGL 4.1で標準化されたGL_ARB_get_program_binaryにより、コンパイル済みバイナリのシリアライズ・逆シリアライズが拡張としてサポートされるようになったが、バイナリがベンダー間で互換性のある中間形式であるかどうかは保証されない。OpenGL 4.5で標準化されたGL_ARB_parallel_shader_compileにより、マルチスレッドを利用したシェーダーの並列コンパイルが拡張としてサポートされるようになった。デバイスドライバーがGLSLコンパイラを内蔵していることから、ドライバーによってシェーダープログラムのコンパイル結果や実行結果が異なる可能性があるなどの品質問題も抱えている。 OpenGL 4.6では中間表現SPIR-Vがサポートされるようになり、オフラインコンパイルが可能になったことから、OpenGLでプログラマブルシェーダーを利用するために必ずしもGLSLを利用する必要はなくなった。なお、Direct3Dのシェーディング言語であるHLSLはリリース当初から、コンパイル結果はベンダー非依存のバイトコードで出力され、またコンパイル済みバイナリの読み込みもサポートしていた。
※この「コンパイルと実行」の解説は、「GLSL」の解説の一部です。
「コンパイルと実行」を含む「GLSL」の記事については、「GLSL」の概要を参照ください。
- コンパイルと実行のページへのリンク