ホーム < ゲームつくろー! < プログラマブルシェーダ編

シェーダシステム編
その1 シェーダを柔軟に作りたいのですよ


 多分多くのシェーダプログラマの皆さんはこういう共通認識を持っていらっしゃるのではないでしょうか。はい、息を吸って〜…叫びましょう!「シェーダって柔軟性がまったくねぇ!!!」

 そうなんです。シェーダはハードウェアの機能を最大限に利用して超高速に処理をするために、完全に柔軟性を排除した作りになっています。シェーダ内関数(サブルーチン)は作れますが、コンパイルされた段階でそれらはすべて展開されて、一本の男気溢れる数値コンバートなアセンブラコードになります。

 これにより美麗な映像を超高速に創り出すことが可能になったのですが、一方でプログラマには「同じようなシェーダコードを書き続けさせる」という苦行を強いるようになりました。ちゃんとしたシステムを持っている所は別として、AとBのモデルの僅かな表現の違いを2つのシェーダを書くという力技で対処する事が実際に行われています。プログラマブルシェーダの持つカチンコチンな性質は、兎にも角にも私たちを苦しめるわけです。

 この状況を何とか打開し、シェーダを柔軟に作れないものか?これが「シェーダシステム編」の目指すべき目標です。



@ 条件分岐にもコピペ複製にも悪夢が…

 プログラムを柔軟にするために真っ先に思いつく事は、プログラム内で条件分岐を作る事です。しかし、シェーダプログラムではこれが難しいんです。もちろんシェーダ内でifは使えます。ピクセルシェーダでも使えるようになりました。でも、条件分岐はコストの高い処理です。ピクセルシェーダで使うと1画面を覆うためにifを100万回以上呼び出します。処理速度が劇的に下がってしまうため、使うに厳しいんです。

 そこで、2つの条件があった時に2つの独立したシェーダを作る事を考えます。こうするとシェーダ内での条件分岐は回避されるため、パフォーマンスの低下を防げます。しかし、これは同時に「2つのシェーダプログラムを書く」事を強います。

 今、2つのシェーダが作られる事にはひとまず目を瞑りましょう(本当は組み合わせ爆発の回避が必要です)。厳しいのは、それをプログラマが「手で」作ることにあるんです。ひじょ〜〜〜に似た2つのプログラムを作る。シェーダはテキストですから大抵はコピペです。そしてある部分に訂正が入った時、全シェーダソースの書き換えが始まります。また、新しい表現が加わった時に同じような部分をコピペ…。

 コピペが招くこういう悪夢はプログラマなら誰しもが知るわけで、この作業ははっきりとよろしくありません。でも、仕方が無いんです。だって、シェーダは「多態性の欠片も無い超絶に柔軟性が無いプログラム」なわけで、こうする以外に対応策が無いんです。

 とは言え、はてさて、どうしたものか…



A シェーダの自動生成

 そこで考えるのが「シェーダの自動生成」です。2つの違いをシェーダを作る内部の機構で吸収できれば、違いが増えても怖くありません。また全く同じ部分は使い回し、ちょっとの違いは多態性でカバーする。そうやって効率的にシェーダを自動的に作り上げられれば、シェーダは一気に柔軟性を持ち始めます。

 この編で考えるのはそういう自動生成の機構です。ちょっと考えただけでも複雑で恐ろしく大変なのですが(^-^;、問題を小さくしながら少しずつ進めていけばきっと何とかなります。よおし頑張りましょう〜