ABA style で pixel shader とか

なんか長らくシェーダとか触ってみたかったのに触ってなかったので触ってみた。

http://shinh.skr.jp/tmp/pbg_ps.tar.bz2

ABA style ってのは id:ABA さんが偉大すぎてプリミティブと半透明だけでデザインがんばってゲーム作るとそう呼ばれるらしい。で、こう shader とかって基本的にはリアル絵出すためのものだけど、まぁそいうの興味無いっていうか絵かけないしモデリングとかよくわかんないしーってこと(興味はあるけどいじけてるというか)でそっち方向でもシェーダって使えないのかなとかそんなことを思って勉強してみることに。うーん日本語になってないがまぁそんな感じ。

中身は pbg.exe を実行すると動く。左と右でピクセルシェーダ変更 (PS 0 ってなってるところが変わるはず) 、 r で PS のリロード、 s で現在の PS を一番最後のシェーダ番号のところに保存 (配布物には ps/7.fp まで入ってるから保存すると 8.fp になる)。 0.fp を適当にいじって気に入った絵が出たら s してまた書く、ってのが想定された使い方。

ARB_vertex_program 拡張が入ってない GPU では動かない。特にチェックしてないからたぶん落ちたりイヤなことが起きると思います。珍しいことに Windows 以外ではチェックされてない。というのは今 LinuxcoLinux でしか動いてないので、 Linux から WINE でビルドしてる。クロスコンパイラで GLee とかたぶん結構めんどいので。

時代に乗り遅れまくりの子が数日触っただけの素人雑感。

基本的にはシェーダってややこしいモデルを処理する時に見栄えを調整するって感じなはずなので、全ての出力が手のうちにある ABA style にはあんまり向いたもんじゃないとは思う。で、何に使えるか、ってこと考えると演出のメインの要素として使う、ってよりは、画面全体に手軽にエフェクトをかける、ってシーンに良いと思う。

特に 3.fp や 4.fp みたいな画面全体の色を変える、なんてのは問題なく CPU 側の処理でできるわけだけど、 PS でやった方がラクができるかなぁと思う。要はファミコンとかの時によくあったようなカラーパレット切り替えるような感じというか。

でもそれだけじゃ PS 使うメリット無さすぎなので、 5.fp, 6.fp, 7.fp みたいな感じでピクセルの点の位置情報使ってエフェクトか書けるのはまぁシェーダ特有かもしれない。

エフェクトに使うだけならシェーダの無い環境なら別のエフェクトを使う…とかもまぁしやすいし。

で環境なんだけど、テストに使ってるのは Thinkpad X60 とかで、これ nVidia とか ATI じゃなくてインテルチップセットなんだけど ARB_vertex_program や ARB_fragment_program くらいは入ってたので、あーそろそろ初代シェーダは存在してると仮定してもそんなにポタビリチー落ちないのかなぁとか思う。

開発は fp/ 以下のファイルを適当にいじってガンガンリロードして動的に動作チェック、ってのは GL のわけわからんパラメータをあちこちいじるよりはラクなように思える。ただまぁ 6.fp や 7.fp は時間情報を使いたかったのでプログラム側からパラメータを渡していて、こういうことする時は元のソースもいじらにゃならんのだけど、理想的にはこのへんの部分こそ Lua とかそいうのに分離できるといいんじゃないかな、やらないけど。

ARB_*_program でコードを書く場合問題になるのはアセンブリで書かにゃならんのでめんどい&保守しにくい、ってこと。特にエラー出た時にどこでエラー出てるかさっぱりわからないのは結構きびしいかも。ただまぁアセンブリって言ってもインストラクションの数少ないしそんなに大変じゃないとは思う。

まぁもちろん Cg を使う、ってのは間違いなく正しい解だと思う。たぶん Cg を使う方法は二種類あって、コンパイラを静的に走らせて fp ファイルを生成する方法が一つ。この方法だと書き換えて即実行のお手軽感がちょっと落ちるかもしれない。もう一つは libcg をリンクして動的にコンパイルしてもらう方法。この方法はお手軽感は損わないけどたいしたことしないのに libcg をリンクするってのもなぁ、とは思う。まぁ開発時は libcg でリリース時は静的にコンパイル、っていう態勢を整えればいいだけの話じゃないかな。

偉そうに色々書いたけど素人もいいところなので、まだまだ機能把握してないし、応用はいくらでもあると思うし、もっとセンスのいいもの書きたいものだと思うけどまぁそのへんはセンスのある人が。

あとまぁ vertex shader の方もやってみたいことはあるので地道にやってみたいと。

ARB_fragment_program 書く時は、ぐぐって出てきた適当なサンプルを ARB の仕様見ながらいじる、って感じでやった。以下の 3.11.4 の項目を見るとまぁだいたいどんな命令があるのかはアタリがつく。 reciprocal が逆数って意味だと知らなくて割り算どうやってやるんだーとしばし悩んだのは秘密。

http://oss.sgi.com/projects/ogl-sample/registry/ARB/fragment_program.txt

あとは日本語のリソースだとやはり t-pot さんとこが色々ためになった。

http://tpot.jpn.ph/t-pot/program/

あとライセンスは GPLv2 or later 。 fp/ 以下にピクセルシェーダは入ってるけど勉強しながら書き散らかしたものだし汚なすぎるので注意。

あとビルドは以下のコマンドでやってます。

dmd.exe -O -g -Isdl -Iopengl -Iglee *.d sdl/*.lib opengl/*.lib GLee.lib SDL_pad.lib -ofpbg.exe || exit
なにかあれば下記メールアドレスへ。
shinichiro.hamaji _at_ gmail.com
shinichiro.h