view rendering.tex @ 4:00ef3b6ef98a

*** empty log message ***
author akira
date Tue, 04 Mar 2008 19:09:01 +0900
parents 4ee5cef03d5f
children cba427f17200
line wrap: on
line source

\section{レンダリングエンジン}
PS3Linuxでは以前我々が扱っていたPS2Linuxと違いGDPに直接アクセスすること
ができない。しかし、フレームバッファは扱うことができる。そこでMesa
\cite{bib:Mesa}のフレー
ムバッファ用ドライバであるOSMesaを使ってゲーム開発を行っていた。しかし、
OSMesaはメインメモリ依存でCellのようなマルチコアアーキテクチャを活かすよ
うな分割を行うことは容易ではない。\\
そこで我々はシーングラフ、レンダリングエンジン、タスクマネージャからなる
Ceriumを例題として用いた。\\
ゲームの中の一つの場面(Scene)を構成するオブジェクトやその振る舞い、ゲー
ムのルールの集合をSceneGraphとする。SceneGraphの各ノードがゲームの一部で
あるオブジェクトのファイルやゲームのルールとなり、ノードをたどり実行する
ことでゲームの中の一つの場面となる。SceneGraphはゲームプログラムとしての
条件を満たす物なので、一つのSceneGraphで小さなゲームと言える。SceneGraph
はBlender3Dモデリングツール\cite{bib:Blender}から出力されるxmlをパースし、
ポリゴンを取得する。ポリゴンとは図\ref{fig:SPAN}の三角形の各頂点の値のこ
とである。そのポリゴン座標を次の動作を汲み取った上で、動作に伴う行列演算
を行う。
\begin{figure}[htb]
\begin{center}
\includegraphics[scale=.4]{fig/span.pdf}
\end{center}
\caption{データ構造}
\label{fig:SPAN}
\end{figure}
\\
レンダリングエンジンはOSMesaの機能を簡素化し、よりシンプルに設計されたフ
レームワークである。OSMesaではいろいろな機能を付加し続けた結果、様々な計
算の部分でコピーがたくさん行われていた。それはCPUに多大な負荷を与えると
ともに動作が遅くなる大きな要因となっていた。そこで我々が提案するレンダリ
ングエンジンはシーングラフからポリゴンの各頂点を受け取り、頂点からSPANを
生成し、SPANに対応するテクスチャを生成するシンプルな物を目指す。ここで
SPANとは図\ref{fig:SPAN}のポリゴンに対するある特定のY座標に関数データを
抜き出した構造体で、そのSPANに対応するテクスチャは右の図のあるラインに対
応する。\\
タスクマネージャはタスクを管理するライブラリで、タスクと呼ばれる分割され
た各プログラムを依存関係を考慮しながらメモリ上にマッピングし、SPU上では
そのプログラムをDMAによりロードする。(図\ref{fig:taskmanager})\\
\begin{figure}[htb]
\begin{center}
\includegraphics[scale=.5]{./fig/taskmanager.pdf}
\end{center}
\caption{タスクマネージャ}
\label{fig:taskmanager}
\end{figure}
\\
これらをCbCで実装すると次のようになる。
\begin{small}
\input{./src/render.c}
\end{small}
上記のソースはシーケンシャルなアルゴリズムでの実装コードである。
SCENEGRAPH2POLYGONではシーングラフの計算を行い、ポリゴンの情報から回転や
拡大、平行移動などの計算を行い、ポリゴンの情報を次のcode-segmentに渡す。
POLYGON2SPANでも同様に、受け取ったPOLYGONからSPANを出力する。SPAN2DRAWで
も基本的に変わらないが、ここで終了条件をみることになる。\\
これらのcode-segmentはすべてSPUで実行される。しかし、これだけでは足りな
い。実際にはSPUにテクスチャ情報をロードするcode-segmentが存在する。SPUで
実行するときは前述した通り、入力データアドレス、入力データサイズ、出力デー
タアドレスが必要となる。これらはタスクマネージャに登録される。
タスクマネージャは次のような関数で実行することができる。
\begin{table}[htb]
\begin{center}
\begin{tabular}{|c|c|}
\hline
set\_symbol & タスクのID登録 \\ \hline
open & IDの取得 \\ \hline
create\_task & タスクを作る \\ \hline
spawn\_task & 実行タスクQueueに追加 \\ \hline
set\_depend & 依存関係の考慮 \\ \hline
run & 実行タスクQueueの実行 \\ \hline
\end{tabular}
\caption{タスクマネージャの関数}
\label{table:task_func}
\end{center}
\end{table}
\\
タスクマネージャは登録されたcode-segmentをみて、プログラムのロードを行い、
入力データの読み込み、計算、出力データの書き出しを行う。タスクマネージャはPPUで実行するかSPUで実行するかを明示的に書くことができる。またSPUを使う場合はSPUコアを使うことができる。そうすると、以下のようなことができる可能性もある。
\begin{figure}[htb]
\begin{center}
\includegraphics[scale=.5]{./fig/pipeline.pdf}
\end{center}
\caption{タスクマネージャが行うパイプライン}
\label{fig:pipeline}
\end{figure}