本サイトでは、アフィリエイト広告およびGoogleアドセンスを利用しています。

(OpenGLの)シェーダーバイナリ(GLSL Binary)

そういえばOpenGL 4.xでシェーダーのコンパイル結果をバイナリとして取得、ロードできる機能が追加されたのですが、当時ドライバがまだ対応していなくて見送っていました。ようやくこれについて調べてみることが出来たので、ここに書いておこうと思います。

まず、DirectXではシェーダーをコンパイルすると各ベンダで共通なシェーダーアセンブリ状態になります。このアセンブリ仕様はDirectXで決められているためにベンダ間で共通データとなります。

OpenGLのGLSLをコンパイルした結果はどうなるのか、これが気になるポイントでした。
DirectXのようにベンダー間で共通のデータとなるようなら便利に使えそうです。また同機能ということでOpenGLがDirectXに追いついた!とも見えるのではと思います。

そこで手持ちの環境で同じシェーダーをコンパイルしてバイナリデータを記録してみました。
ここで用いたのは下記のシェーダーです。

[cpp]
// VertexShader
uniform mat4 vProjViewWorld;
attribute vec4 inPosition;
attribute vec4 inColor;
varying vec4 col;
void main() {
gl_Position = vProjViewWorld * inPosition;
col = inColor;
}

// FragmentShader
varying vec4 col;
void main() {
gl_FragColor = col;
}
[/cpp]

このシェーダーをNVIDIA(Geforce)のボードが刺さっている環境、AMD(RADEON)のボードが刺さっている環境でそれぞれ実行してみました。

この部分はファイル先頭なのですが、この時点からして既に全く違います。
AMDのほうではシェーダーのソースがほぼ見えるのに対し、NVIDIAのほうはそんな様子はありません。
ファイルを適当に中間部分まで表示させてみると以下のようになります。

AMDのほうはよくわからないデータが入っているようです。一方NVIDIAのほうではシェーダーアセンブリっぽいものが格納されているのがわかります。

AMDのほうはバイナリファイルにELFという単語が見えますし、GLSLソースコードが入っていたりとあまりシェーダーバイナリっぽくありません。NVIDIAのほうもNVIDIA拡張のGLのシェーダーアセンブリとして書かれているようで、両者全く違うというのが明らかになったかと思います。

DirectXもシェーダーバイナリはいわゆるアセンブラなのでこの点を考えるとNVIDIAのやっている方が近い感じだと思います。コンパイルされてアセンブリになっているという点が一緒というわけです。
一方でAMDのほうはソースが入っているだけのようにしか見えません。

これらの結果からやはりOpenGLのシェーダーバイナリは実行環境でのシェーダーコンパイル結果のキャッシュデータとしての価値しかなさそうです。実行環境が決まらないようなプログラムではGLSLソースコードを保持しておくしか手がなさそうです。

OpenGLプログラミング
すらりんをフォローする
すらりん日記

コメント

タイトルとURLをコピーしました