レンダーターゲットとレンダーシステム

 XOOPS2 では任意のプログラム(モジュールやブロック)を任意の数だけ実行することができました。ブラウザに出力される最終出力では、それぞれのモジュールやブロックの出力結果をバッファリングしたあと、最後にテーマ上に合成して最終出力としていました。XOOPS Cube は XOOPS2 の処理方針を引き継いだうえで、さらに汎用的な定義が行っています。

 XOOPS Cube には「各プログラムが任意にレンダリングの処理を切り替えることができる」という仕様があります。この仕様を満たすためにも、 XOOPS2 の基本的な考え方となる "バッファリングと合成" を汎用的に定義する必要がありました。 XOOPS Cube では、汎用3Dエンジンから方法論をもってきてモデル化を行っています。3Dの分野は、このお題目を20世紀の頃から研究し、実装してきた実績があるからです。その結果、レンダーシステムとレンダーターゲットという言葉が XC の世界に加わることになりました。

レンダーターゲット

 レンダリングの対象となる書き込み先のことです。キャンバスと考えると分かりやすいでしょう。レンダーターゲットは抽象化のために登場した XOOPS の世界では新しい言葉ですが、存在そのものは昔からありました。たとえば、 XOOPS2 の頃は、標準出力(stdout)、変数、 ob_start() による内部バッファリングがありました。これらもそれぞれの処理におけるレンダーターゲットということができます。

レンダーシステム

 リソースを元にレンダーターゲットに書き込みを行う処理システムです。 XOOPS2 では Smarty を使って、テンプレートを元に HTML を出力してきました。 XOOPS Cube では Smarty 以外のシステムも使える仕様ですから、この工程を抽象化して新しい言葉やインターフェイスでとらえる必要があります。それがレンダーシステムです。

導入の背景

 2000年頃からですが、海外の3Dエンジンで OpenGLDirectX を切り替える仕組みをもったものが登場し始めました。当時はまだPCが低性能で、オブジェクト指向による抽象化は、リアルタイム処理であるゲームの世界では非常に限定的にしか使用できませんでした。その時代に処理速度を事実上無視して登場したのが、 XOOPS Cube の設計ベースとなった Object-oriented Graphic Rendering Engine "OGRE" です。この分野での実用度はゼロではないかと思えるくらい強烈に重いうえにメモリ食いで、ゲームの分野で Java レベルのオブジェクト指向プログラミングを行うことがいかにナンセンスであるかを逆説的に証明するような存在に映りましたが、OpenGLDirectX を実にうまく透過的に扱うことができるエンジンのひとつでした。

 OpenGLDirectX の間には非常に大きな違いがありますが、3Dの描画システムであり、同じグラフィックボードの3D機能(現在はGPU)を用いて映像出力を行うため、それなりに最小公倍が存在します。 OGRE はこの最小公倍に基づいて抽象的なレンダーターゲットとレンダーシステムを定義しました。これは OpenGLDirectX を透過的に扱うだけでなく、同じ DirectX 間の DirectX7 と DirectX8。そして DirectX10 で異なるレンダーシステムを提供することを可能にしました。

 また、3Dはもともと、マルチパスレンダリングを当たり前のように行います。 Nuke 系のプログラムを触っている人ならば、このマルチパスレンダリングというモデルを意識しておいて損はありません。子供たちに画用紙を与えて描いてもらった絵を、縮小コピーしながらレイアウトして学級新聞を完成させるような状況をイメージしてください。

 XOOPS Cube のようなシステムでは、1枚のページの部分を塗っていると意識してモジュールやブロックの描画処理をかけるべきではないというのが自分の考えです。それぞれのプログラムには1枚のキャンバスが与えられ、レンダーシステムは全力でその左上から右下まで塗っていいのです。それが最終出力であるかどうかをレンダーシステムが知る必要はありません。

 レンダーターゲットを細かく切り替えながら必要な数だけ全力描画を行い、最後にテーマを描画する際に、描きあがっているレンダーターゲットの中身を合成するというのが、 XOOPS Cube のレンダーシークエンスの基本的な処理方針(すなわちマルチパスレンダリング)になります。 XOOPS2 のような「巧妙なシングルパスレンダリング」もひとつのテクニックですが、 XOOPS Cube のモデルはあくまで「柔軟なマルチパスレンダリング」です。そして、これにより、マルチパスレンダリングの中の1パスにおいてレンダーシステムを切り替えることが可能になり、お題目の仕様を満たせたというわけです。

 XOOPS Cube Legacy は互換性の問題で、必ずしも上のようにポリシーのある処理になっておらず、勢いレンダーシステムとレンダーターゲットの関係も曖昧でしたが、本来は非常に単純なものだというお話でした。

 おやすみなさい m(__)m