シェーダを使うときの設計がわからん

プログラマブルシェーダを使うと自由自在なことができるけど、その反面自由すぎてクラスとかの設計をどうすればいいか全然見通しが立たない。

具体的にどういうことをやりたいかという視点で考えてみると。

  • ゲームのデザインテーマに沿った大本のシェーダを全部のオブジェクトに使いたい。
  • 一方でキャラクタごとに影とかいろいろとエフェクトを効かせたい。
  • また、画面全体に対してブラーのようなエフェクトをかけたい(ポストエフェクトっていうのか?)

このようにシェーダの使い方も様々になるので、シェーダ処理の箇所を一本化するとかそういうことはできないみたいだ。描画マネージャに登録する構造体にテクニック名やパラメータを渡して、描画マネージャがテクニックのセットやらパスの描画やらを統一して行うというやり方を試しに作ってみてるが、やっぱりいろいろと問題が出てくる。

まず、シェーダに渡すパラメータがシェーダごとに数も種類も多種多様なので扱いづらい。ライトとかのような全体に共通するパラメータもあれば、ほんとに特定のシェーダとオブジェクトにしか使わないパラメータもある。それに、テクニックに含まれる全てのパスをシーケンシャルに実行するだけじゃなくて、パスを選択して実行したいとかパスの間にパラメータやレンダーステートを変更したいだとか、そういう場合が結構普通にありそうなので流れを固定化することはできない。

むしろシェーダごとにクラスを一つ作って、それで描画を完結させるべきなのか。

というのがいろいろ調べている現段階での印象。