diff rendering.tex @ 7:5cfa596eece1

*** empty log message ***
author akira
date Wed, 05 Mar 2008 11:25:22 +0900
parents cba427f17200
children
line wrap: on
line diff
--- a/rendering.tex	Tue Mar 04 20:30:02 2008 +0900
+++ b/rendering.tex	Wed Mar 05 11:25:22 2008 +0900
@@ -1,31 +1,18 @@
 \section{レンダリングエンジン}
-PS3Linuxでは以前我々が扱っていたPS2Linuxと違いGDPに直接アクセスすること
-ができない。しかし、フレームバッファは扱うことができる。そこでMesa
-\cite{bib:Mesa}のフレー
-ムバッファ用ドライバであるOSMesaを使ってゲーム開発を行っていた。しかし、
-OSMesaはメインメモリ依存でCellのようなマルチコアアーキテクチャを活かすよ
-うな分割を行うことは容易ではない。
-
-そこで我々はシーングラフ、レンダリングエンジン、タスクマネージャからなる
-Ceriumを例題として用いた。
-
-ゲームの中の一つの場面(Scene)を構成するオブジェクトやその振る舞い、ゲー
-ムのルールの集合をSceneGraphとする。SceneGraphの各ノードがゲームの一部で
-あるオブジェクトのファイルやゲームのルールとなり、ノードをたどり実行する
-ことでゲームの中の一つの場面となる。(図\ref{fig:scenegraph})
+ここでは例題として用いるレンダリングエンジンCeriumについて説明する。
+Ceriumはシーングラフ、レンダリングエンジン、タスクマネージャから構成され
+る。(図\ref{fig:Cerium})
 \begin{figure}[htb]
 \begin{center}
-\includegraphics[scale=.5]{fig/scenegraph.pdf}
+\includegraphics[scale=.4]{./fig/cerium_detail.pdf}
 \end{center}
-\caption{シーングラフ}
-\label{fig:scenegraph}
+\caption{Ceriumの要素}
+\label{fig:Cerium}
 \end{figure}
-SceneGraphはゲームプログラムとしての
-条件を満たす物なので、一つのSceneGraphで小さなゲームと言える。SceneGraph
-はBlender3Dモデリングツール\cite{bib:Blender}から出力されるポリゴン情報やテクスチャ情報などが記述されたxmlをパースし、
-ポリゴンを取得する。ポリゴンとは図\ref{fig:SPAN}の三角形の各頂点の値のこ
-とである。そのポリゴン座標を次の動作を汲み取った上で、動作に伴う行列演算
-を行う。
+
+SceneGraphはBlender3Dモデリングツールから出力されるポリゴン情報やテクス
+チャ情報などが記述されたxmlをパースし、XYZの頂点座標を取得する。図\ref{fig:Cerium}のSceneGraphの入力はXYZの頂点座標となる。XYZの頂点座標をキー入力にあわせて、拡大や縮小、移動などを行うのがTransformとなる。XYZの頂点をポリゴンにまとめるのがGatherとなる。
+ポリゴンとは図\ref{fig:SPAN}の三角形の各頂点の値のことである。
 \begin{figure}[htb]
 \begin{center}
 \includegraphics[scale=.4]{fig/span.pdf}
@@ -33,16 +20,14 @@
 \caption{データ構造}
 \label{fig:SPAN}
 \end{figure}
-\\
-レンダリングエンジンはOSMesaの機能を簡素化し、よりシンプルに設計されたフ
-レームワークである。OSMesaではいろいろな機能を付加し続けた結果、様々な計
-算の部分でコピーがたくさん行われていた。それはCPUに多大な負荷を与えると
-ともに動作が遅くなる大きな要因となっていた。そこで我々が提案するレンダリ
-ングエンジンはシーングラフからポリゴンの各頂点を受け取り、頂点からSPANを
-生成し、SPANに対応するテクスチャを生成するシンプルな物を目指す。ここで
-SPANとは図\ref{fig:SPAN}のポリゴンに対するある特定のY座標に関数データを
-抜き出した構造体で、そのSPANに対応するテクスチャは右の図のあるラインに対
-応する。
+
+レンダリングエンジンはSPANを生成する部分とSPANにRGBをマッピングし描画す
+る部分とに分けることができる。SPANとは図\ref{fig:SPAN}のポリゴンに対するある特定のY座標に関するデータを抜き出した構造体である。
+SPANを生成する部分は図\ref{fig:Cerium}のcreate\_spanの部分に相当する。Create\_SPANではポリゴンからSPANを計算する部分(CreateSPAN)とテクスチャを読み込む部分(TextureImage)のみ行う。
+
+SPANにRGBをマッピングし描画する部分は図\ref{fig:Cerium}のDRAWの部分に相当する。
+DRAWではCreate\_SPANで生成されたSPANを受け取り、ZBufferをみながら描画するデータをメモリに書き込んでいく。ZBufferとは画面サイズ分用意されたZのメモリ空間で、XY座標に対する描画されるZの値が代入されている。SPANのZ座標とZBufferのZを比較し、カメラからみてどちらが手前にあるかというのを判断するのがDRAWのZcompareである。
+実際にZBufferと比較して描画するSPANであるならば、XY座標に対してのテクスチャのRGB情報をメモリに書き込む。その役目が図\ref{fig:Cerium}のMapping RGBとなる。RGB情報をマッピングした後、実際に描画するのがWriteFBとなる。
 
 タスクマネージャはタスクを管理するライブラリで、タスクと呼ばれる分割され
 た各プログラムを依存関係を考慮しながらメモリ上にマッピングし、SPU上では
@@ -54,21 +39,7 @@
 \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で
-実行するときは前述した通り、入力データアドレス、入力データサイズ、出力デー
-タアドレスが必要となる。これらはタスクマネージャに登録される。
+これはSPUのLSが256Kbしかないため必要になる。
 タスクマネージャは次のような関数で実行することができる。
 \begin{table}[htb]
 \begin{center}
@@ -79,6 +50,7 @@
 create\_task & タスクを作る \\ \hline
 spawn\_task & 実行タスクQueueに追加 \\ \hline
 set\_depend & 依存関係の考慮 \\ \hline
+set\_cpu & タスクを行うCPUのセット \\ \hline
 run & 実行タスクQueueの実行 \\ \hline
 \end{tabular}
 \caption{タスクマネージャの関数}
@@ -86,12 +58,5 @@
 \end{center}
 \end{table}
 \\
-タスクマネージャは登録されたcode-segmentをみて、プログラムのロードを行い、
-入力データの読み込み、計算、出力データの書き出しを行う。またcreate\_taskのときに入力データのサイズやアドレスなどが登録される。タスクマネージャはPPUで実行するかSPUで実行するかを明示的に書くことができる。またSPUを使う場合はSPUコアを使うことができる。そうすると、図\ref{fig:pipeline}のようなことができる可能性もある。
-\begin{figure}[htb]
-\begin{center}
-\includegraphics[scale=.5]{./fig/pipeline.pdf}
-\end{center}
-\caption{タスクマネージャが行うパイプライン}
-\label{fig:pipeline}
-\end{figure}
+タスクマネージャは登録されたタスクをみて、プログラムのロードを行い、
+入力データの読み込み、計算、出力データの書き出しを行う。またcreate\_taskのときに入力データのサイズやアドレスなどが登録される。またタスクマネージャはPPUで実行するかSPUで実行するかを明示的に書くことができる。またSPUを使う場合はSPUコアを使うことができる。