こんにちは。
昨晩コミットした Revision: 58 はXCだじぇいの次の XOOPS Cube スレ終盤で話題になったレンダーシーケンスに関するアプローチ修正を反映させたものです。これにより、
- レンダーシステムにレンダーターゲットを設定
- レンダーシステムにアトリビュートをアサイン
- レンダーシステムにリソースを設定
- レンダーシステムの render() をコール
で、レンダリングが行うことができるようになりました。
従来の XCube コア sandbox ブランチの試作版では、レンダーシステムやレンダーターゲットの切り替えは完全にコア側で行うことになっていて、描画申請側からは描画コマンドを投げることしかできませんでした。しかし、最新のコミットではコア側は描画順の制御しかやってません。シーケンスがすっきりしたのはこのためです。
しかし、これは一旦プログラムをすっきりさせる働きのある修正ではありますが、コアのレンダーシーケンスの制御機構としての性能は確実に低下しました(ありがち)。
まず、第一に Cube コア側から使用したレンダーシステムとターゲットが見えないという難点があります。このため、「描画シーケンス中にレンダーシステムが変更できる」という Cube のスペックをコア側で隠蔽するチャンスがなく、その仕組みは全面的に BASE から提供してもらわないといけません。当然 BASE 間でばらつきが出れば、マルチ BASE 対応モジュールの開発はそのぶん手間になります。
次に、レンダーシステムがレンダリングに使用するパラメータを直接持つことになってしまったため、ある描画が前工程のパラメータを使用していたとき、ユーザーさんが前の方で使うレンダーシステムを変更してしまう(なにかのMODを入れちゃう)と、後ろの工程にモロに影響が出ます。これは XOOPS2 ではテクニック化していましたが、 XOOPS Cube 以降はどのタイミングでレンダーシステムが切り替わるか分からないため、禁止事項になっていたものです。コア v0.9 がレンダーターゲットにパラメータを仕込むようにして、空間を独立させていたのはこのためなのですが、それが XOOPS2 時代まで戻ってしまいました。
ちなみに、今回はコレクションの中でレンダーシステム単位のソートを行っていません(ドローオブジェクトがどのレンダーシステムを使用するかがコア側から見えないため)。そのため、 onokazu さんのいうレンダーシステムをコレクションに突っ込ませてレンダリングさせるというアイデアを積むことはできませんでした。
今回の修正で、すべての描画/合成要素をレンダーターゲット単位でとらえつつ、設計自体を分かり易くしていく(過度のシーケンスをコア側で持たない)のは難しいと分かりました。最終出力の合成と、その構成要素内の合成的処理のプロセスを分けて処理する方向へ持って行こうと思います。
なおコミットログには書きましたが、今回から暫く hello world 以外のサンプルは動作しません。 orz
