HTML グラフィックプロセッサ概要
XOOPS Cube のレンダリング周りの設計はゲームエンジンから取ってきている。これはレンダーシステムの切り替えや、分割レンダリングの考え方が進んでいると考えているからだ。
(一般的な Web プログラムだと XOOPS のような "Mod" 文化がない限り、それについて考えなくてよい……まぁゲームもだけど)
XOOPS Cube コアのレンダリング周りを Fix する前に、もう一度 Web プログラミングの描画について考えてみる。
HTML がグラフィックプロセスユニットに送る信号であり、 Web ブラウザが映像表示の装置と考えると、このパイプラインが持つ仕様は以下のような形になるだろう:
- 一度の Draw Call ですべてを描画します
- プロセッサに送る情報は Head 部と Body 部に分かれます
- Body で指定するマテリアルが使用するシェーダ(CSS)は Head 部でまとめて読み込まなければなりません
- 映像装置へ Javascript プログラムを転送できます。その情報は Head 部にまとめる必要があります。
泣いても笑っても、このプロセッサしかないという状況と考えよう。
XOOPS Cube はモジュール作者が好きなレンダーシステムを指定して描画できることを保証している。このときレンダーターゲットの概念でこれを実現する。複数のモジュールがひとつずつレンダーターゲットを持ち、これをテーマにはりつけて最終出力を行う。
レンダーターゲットへの描画は仮想的な Draw Call である。実際にはプロセッサには送られず内部でプールされる。しかし、正しく描画を行うには、レンダーターゲットに行った HEAD 出力は仮想のものとせず、プロセッサへバイパスしなければいけない。
Javascript プログラムの転送リクエストの件を考えても HEAD 部の出力は別の概念で扱った方がいいだろう。
Draw Call 1回、 CSS 切り替え不可
様々な働きを持つ Head 部は Draw Call が全体で1回のため、転送チャンスも1回。同じマテリアルを指定するが、パラメータを変更して Draw Call して別の形で描画するという方法はこのプロセッサ(=Web プログラム)では使用できない。マテリアル指定側を切り替えなければいけない。
ここを頭に叩き込んでおけば Duplicatable で行き詰まった時に切り分けができそうだ。
仮想 Draw Call
XOOPS Cube は仮想の Draw Call を提供するが、実際には1回の Draw Call にまとめるためにプーリングしている。迷ったら「俺たちは仮想 Draw Call を提供するんだ」という前提に帰ろう。
なお、 Draw Call に例えたが、 Web には Draw Call にあたる描画行為は(仮想的にも)ない。が、頭の中を整理しやすいので書いた。