シェーダを柔軟に作りたいのですよ多分多くのシェーダプログラマの皆さんはこういう共通認識を持っていらっしゃるのではないでしょうか。はい、息を吸って〜...叫びましょう!「シェーダって柔軟性がまったくねぇ!!!」そうなんです。シェーダはハードウェアの機能を最大限に利用して超高速に処理をするために、完全に柔軟性を排除した作りになっています。シェーダ内関数(サブルーチン)は作れますが、コンパイルされた段階でそれらはすべて展開されて、一本の男気溢れる数値コンバートなアセンブラコードになります。これにより美麗な映像を超高速に創り出すことが可能になったのですが、一方でプログラマには「同じようなシェーダコードを書き続けさせる」という苦行を強いるようになりました。したシステムを持っている所は別として、AとBのモデルの僅かな表現の違いを2つのシェーダを書くという力技で対処する事が実際に行われています。プログラマブルシェーダの持つカチンコチンな性質は、兎にも角にも私たちを苦しめるわけです。この状況を何とか打開し、シェーダを柔軟に作れないものか?これが「シェーダシステム編」の目指すべき目標です。条件分岐にもコピペ複製にも悪夢が...プログラムを柔軟にするために真っ先に思いつく事は、プログラム内で条件分岐を作る事です。シェーダプログラムではこれが難しいんです。シェーダ内でifは使えます。ピクセルシェーダでも使えるようになりました。条件分岐はコストの高い処理です。ピクセルシェーダで使うと1画面を覆うためにifを100万回以上呼び出します。処理速度が劇的に下がってしまうため、使うに厳しいんです。そこで、2つの条件があった時に2つの独立したシェーダを作る事を考えます。するとシェーダ内での条件分岐は回避されるため、パフォーマンスの低下を防げます。これは同時に「2つのシェーダプログラムを書く」事を強います。今、2つのシェーダが作られる事にはひとまず目を瞑りましょう(本当は組み合わせ爆発の回避が必要です)。厳しいのは、それをプログラマが「手で」作ることにあるんです。ひじょ〜〜〜に似た2つのプログラムを作る。シェーダはテキストですから大抵はコピペです。ある部分に訂正が入った時、全シェーダソースの書き換えが始まります。新しい表現が加わった時に同じような部分をコピペ...。コピペが招くこういう悪夢はプログラマなら誰しもが知るわけで、この作業ははっきりとよろしくありません。シェーダは「多態性の欠片も無い超絶に柔軟性が無いプログラム」なわけで、こうする以外に対応策が無いんです。シェーダの自動生成そこで考えるのが「シェーダの自動生成」です。2つの違いをシェーダを作る内部の機構で吸収できれば、違いが増えても怖くありません。同じ部分は使い回し、ちょっとの違いは多態性でカバーする。やって効率的にシェーダを自動的に作り上げられれば、シェーダは一気に柔軟性を持ち始めます。この編で考えるのはそういう自動生成の機構です。考えただけでも複雑で恐ろしく大変なのですが(^-^;、問題を小さくしながら少しずつ進めていけばきっと何とかなります。よおし頑張りましょう〜。