レンダー周りをゴシゴシ修正中
onokazu さんの指摘*1を受け、レンダーターゲットをレンダーシステムにセットしてからレンダーシステムのAPIで描画する方式に切り替え始めている。ちょっと描画済みバッファへのアクセスのところだけが野暮ったいが、これでレンダーシステムとレンダーターゲットの関係も分かりやすくなったと思う。
これにともない、レンダリングは直制御しかありえなくなったため、レンダーオペレーション機構も微調整している。従来のレンダーオペレーションは「描画コマンド」としての扱いになっていた。コアの描画系がレンダーシステムとレンダーターゲットを直接扱うので、プログラムはオペレーションを発行して描画を依頼しなさい、という考え方だった。
ここを、レンダーオペレーションのインターフェイスを実装しているオブジェクトを返しなさい、という具合に変え始めてる。つまり draw の実行順だけ制御しますけど、 draw は直接やんなさいよという構造です。よくある実行順と描画順の別制御。
欲を言えば、描画用バッファと描画ソースと描画システムは全部別物なので、タスクの中ではリクエストだけに発行するようにしたいんだけど……とはいえ描画コマンドしか扱えませんというのも厳しいので、やるなら描画オブジェクトとして扱わないといかんかなぁ。
しかし1時半に帰ってから開発は無謀だった……眠い。そして今気づいたが sandbox にコミットしてなかった。orz
*1:半年くらい前の...orz
オートパラム
テンプレートは様々な外部パラメータにアクセスする。その外部パラメータはあらかじめプログラム側から書き込んでおかなければならない。テンプレートと呼ばれているが、描画シークエンスでみればプログラマブルシェーダを使ったレンダリングによく似ている。
プログラムからのシェーダパラメータ書き込みを、プログラマがリクエストするか、アートファイルに情報として持っておいて、アート側からリクエストを送れるようにするかはよく議論になる。実際にプログラマの領分でもあり、ビジュアルの領分でもあるのはWebも同じ。
- レンダー切り替えがありえる
- テンプレートのためになるべく多くのパラメータを書いておくことが推奨される
- 一方で、高速化のために無駄なパラメータを書きに行ってはいけない矛盾
という点も完全に同じだ。
汎用エンジンでたまに見かける自動パラメータ適用(ビジュアルリソース側からリクエストリストを提供すると、半自動でパラメータが書き込まれてシェーダがアクセスできる仕組み)が同じく解決に役立つと考えている。