kumaryu日記
2010-07-30
_ [Ruby] GLSLパーサ作り
プリプロセッサはなんとか出来たっぽく見える。
テストは足りない気がするがまあそれはバグってから追加していくでも。
本編であるGLSLらしい部分のパースに入っていくわけだが、その前にソース整理をしたいかな。ちょっと汚い。
GLSLのパースもどういう作りにするかが悩ましい。 バージョンはおろか、拡張の有無で言語仕様がばんばん変わる恐しい言語なんだが、GLSL4.10までならともかく今後も1年半に2回くらいだかでアップデートされるし、特にNVIDIAは頑張って拡張作りまくるのでその都度俺が対応するのは嫌だ。というかコンパイラじゃなくてパーサだから使う方も急に対応されてもこまるんじゃね。
幸いプリプロセッサはさすがに拡張されてない*1ので良かったんだが、本編(?)は何か考えないとな。
こんな感じが良さそうなんだけど上手く分離できるかねぇ。
##highlight ruby require 'glslparser' # 標準ではGLSL1.10までパース可能 require 'glslparser/glsl150' # GLSL1.50までパース可能に! require 'glslparser/arb_shader_stencil_export' # ARB_shader_stencil_export使ったのもパースできる! GLSLParser.parse(<<EOS) #version 150 #extension GL_ARB_shader_stencil_export : require void main() { ... } EOS
使える拡張とかバージョンを動的には切り替えられないけど、まあそこまではやらんだろう。 でも#versionディレクティブとか#extensionディレクティブ見つけたらパーサ切り替えないといけなくね!?
…パーサだから全部パースしちゃうのはいいか。使えない機能に文句言うのはコンパイラなんかのパーサより先の仕事か。
別ファイルで文法の拡張はcitrus使ってるからやりやすいはずだけど、どうだろう。どうだろうっつーか書いてみないとわからんか。
*1 …え、#include?いつのまに追加されてたの?
_ [OpenGL] OpenGL周辺のアップデート
NVIDIAが早速4.1対応のドライバ出したり、AMDがGLES2対応のCatalyst出したりしましたね。
GLES2対応のCatalystってRadeon挿してないので確認できてないんだけどどういうもんなんだろ。EGLとかGLES2.dllとかついてるんだろうか。
NVIDIAのドライバではGLXとWGLにEXT_create_context_ES2_profileっていう拡張が。コンテキスト作る時にGLES2のプロファイルを指定できて、それを使うとGLES2にある関数以外は取得できなくなるそうな。コンテキスト作ったりの部分はEGLと異なっちゃうけど、OpenGLからGLES2に徐々に移植とか簡単に両対応を確認したいとかに丁度いい感じ。
ところでSIGGRAPH2010でのOpenGL BOF資料が早速出てました。世の中ではOpenGL4.1しか大きく取り上げられないけど、Ecosystem Updateを見たら周辺がだいぶ興味深いじゃないですか。
一つは待望のOpenGL用テクスチャファイルフォーマットKTX <URL:http://www.khronos.org/opengles/sdk/tools/KTX/>。DirectXだとDDSが標準であってツールも多くがDDS対応してるんですが、OpenGLには標準テクスチャフォーマットが無くて、ただの2D画像ならともかくキューブマップとか3DテクスチャになるとDDSを使うとか自分で作るとかでなんとかする必要があったんですよ。でもDDSはDirectXの奴なんでフォーマットやパラメータをOpenGLにそのまま対応できなくてめんどいなーとか、テクスチャといったら左下基準だろJKとかあって微妙に使いづらい。
そこでついにKhronosができとーにまとめてやんよで作ったのがKTXだ。フォーマットはDDSもそうだが至って簡単なのでドキュメントを見るといい。至って簡単だが標準であるってのはいいよね。ツールとか作りがいがあるし。
libktxってライブラリも用意されてるが、ETCっていうケータイ向けっぽい圧縮フォーマットに対応してるおかげでライセンスがややこしいので注意だ。圧縮いらないんだったら自分で書いても簡単だよ。
次に嬉しいのはGLU3 <URL:http://dri.freedesktop.org/glu3/>。GLUの新バージョンだ。なんかC++になってたよ。
簡単ではあるが、4コンポーネントのベクトルと行列クラス、シェーダを手軽に読み込める関数、立方体とか球を生成してくれるクラスなんかが用意されてた。超簡単なのですげー便利ってほどではないけど、ちょこっとOpenGLで描画する奴をさっくり書きたいという時にはいい感じでしょう。
欲を言うともうちょっと高機能になっちゃうかもしれないけど、GL3以降のcoreプロファイルとかGLES2のglBegin/glEndが無い環境向けにバッファオブジェクトをラッピングするクラスが入らないかなぁ。
最後にこれはまだ具体的なライブラリや実装はないけど、Desktop EGLが出てきた。
GLESでは描画コンテキストを作るAPIにEGLっていう規格があって機器が違ってもGLESの部分だけじゃなくてコンテキスト作る部分も同じにできる。一方PC向けではWindowsではWGL(GDI)、MacではCGL、X Window SystemではGLXといったように環境によってAPIが違ってて、さらにEGLはそのどれとも違ってるわけだ*1。
これはまあ不便なのでどうせならPCでもEGLが使えるといいねということで、EGLのPC向け版であるDesktop EGLが作られるようだ。
具体的にどこが違うのかなんかはまだ分からんけど、今までコンテキスト作成あたりの各プラットフォーム対応はめんどかったので統一されるって話だけでも十分嬉しい。MacOSXでは未だにOpenGL3以降のコンテキストを作る方法が無いんだけど、もしかしたらDesktop EGLでのみ対応とかやるのかもね。
*1 EGLはGLXをベースにはしてるから似てはいる。