2008-01-19

OpenGL と LLVM の話

昔の同僚の Apple ファンからメールをもらった. 去年のマイコミジャーナルの記事 にある OpenGL と LLVM の関係がようわからんので教えろとのこと. ざっと説明を書いてみたらそれなりに良いまとめになった気がするので 無断転載してみることに. 若干くどくて知ったかぶり風なのは見逃してください.

1. Shading Language について

最近の OpenGL には Shading Language (略して GLSL) というのがあります. 物体の質感を表現するための専用言語, いわゆる DSL です. 昔の OpenGL は質感の表現に使う式が固定されていて, プログラマはパラメタだけを指定していました. リッチな質感を表現するのにはテクスチャを使い, 更にリッチにするときは複数のテクスチャを使って色々やってました. これを "固定機能パイプライン" といいます. ハードウェアが速くなるにつれて質感表現に対する要求も高くなり, 仕様で固定していた照光の式をプログラマがカスタマイズできるようになりました. その式(というか計算)を記述する言語が GLSL です. C 言語に似た言語です. GLSL などの shading language で書いたプログラムを "シェーダ" といいます. このシェーダはふつう GPU の上で動きます. GLSL のソースコードは実行時(!)にランタイムによって GPU の機械語にコンパイルされ, 実行されます. 機械語は GPU 依存で, プログラマからは見えません. (初期の hardware shading language はアセンブリ風だったので, その命令セットをみると雰囲気はわかります. 僕はこのころに "もうついてけない..." と思いましたが, 高級言語になって楽になりました.)

そんなわけで, CG 関係の読み物で出てくるシェーダというのは 要するに照光式を計算するプログラムのことです. リアルタイムでない CG の世界では RenderMan の時代から シェーダが使われてきました. それが最近 (といっても 5-7 年前くらい?) は GPU を使い, 対話的な速度で動くようになった ... というおはなしです.

2. Apple の OpenGL と LLVM について

Apple 製 OpenGL では, 先の GLSL の実行に LLVM が使われているそうです.

基本的に GLSL は GPU の上で動くのですが, ノート PC や mac mini, あとは iphone みたいに ハードウェアのしょぼいマシンだと, 搭載 GPU がシェーダに対応していないことがあります. その場合に LLVM を使って GLSL をネイティブ CPU コードへ JIT コンパイルし, 実行するということみたいですね. (LLVM の JIT はライブラリとして組み込める作りになってます. リンク先のニュース記事では gcc ベースと書いてありますが, gcc はオマケというか frontend のひとつに過ぎません.) 昔は自家製の JIT を使っていたけれど 挫けて LLVM に乗り換えたと上のスライドに書いてありました. LLVM のエースは今や Apple 社員です.

シェーダは頂点単位, ピクセル単位で実行されるので, 速度が命です. なので JIT するのは自然な流れです. GPU よりはだいぶ遅いでしょうが, VM よりは速いでしょう. Mac OS は Quartz Extreme のせいで OpenGL が必須だからこのへんは大変ですね. Windows の Aero も似たようなもんですが無効にできますからね.

リアルタイムグラフィクスではないけど, オフラインレンダラ書きの人が シェーダに LLVM を検討してました. あとは Adobe の After Effect に載るらしい Core Image みたいなやつも CPU を使う場合のバックエンドは LLVM だそうです. この AIF/Hydra は Flash10 にもついてくるという話なので, Flash も LLVM 内蔵になるんですかね. ちょっとでかそう.

3. そのほか教科書とか

GPU 向けシェーディング言語は OpenGL の専売ではなく, DirectX にも HLSL という名前で載ってます. 文法も似たようなもんです. 今は流行ってませんが NVIDIA も Cg というのを作ってます. これも同系統.

シェーダを使うと出せる絵を見るには ぐぐってみるとか, あとは NVIDIA や AMD(元ATI) が出してるシェーダ用 IDE 付属の サンプルをみるとよくわかります.

特にこれらの IDE は会社でさわってみるのをおすすめします. 色々サンプルがついてくるし, パラメタをいじったりもできます. ぶっちゃけ典型的なシェーダで欲しい絵なら これについてくるサンプルをちょっといじってコピペすれば 実現できる気がします.

GLSL には オフィシャルな教科書} があります. DirectX は SDK 付属の資料が親切です.

シェーダの色々なテクニックは GPU Gems シリーズ, ShaderX シリーズに詳しいそうですが, 僕はちゃんと読んだことがありません.

入門向けだと, ちょっと古いけど "t-pot"(ウェブサイト) とか "リアルタイムレンダリング" とかがあります. 前者はシェーダに限らず応用中心, 後者は網羅的で厚いなりにおすすめです.

といったところです.

まとめ

関連ありそうな記事