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 にあたる描画行為は(仮想的にも)ない。が、頭の中を整理しやすいので書いた。