view paper/cerium.tex @ 0:fd9154e03f46

thesis
author e065725@kinjyo.cr.ie.u-ryukyu.ac.jp
date Sat, 13 Feb 2010 21:38:25 +0900
parents
children
line wrap: on
line source

\chapter{Cerium} \label{chapter:cerium}

Cerium \cite{cerium} は、我々が提案したゲーム開発フレームワークで、
独自に レンダリングエンジン (\ref{sec:cerium_rendering}節) を持つ。
ゲーム中のオブジェクトの振る舞いや
ルールは シーングラフ で管理し、
それらの動きやレンダリングの処理を動的に SPE に割り振るカーネルとして
タスクマネージャ が用いられる。

Cerium は C++ で実装されており、画像の読み込みや入力デバイスは
SDL を用いて行っている。

\section{タスクマネージャ} \label{sec:taskmanager}

タスクマネージャは、タスクと呼ばれる、分割された各プログラムを管理する。
タスクの単位はサブルーチンまたは関数とし、タスク同士の依存関係を考慮しながら
実行していく。

\section{シーングラフ} \label{sec:cerium_scene_graph}

ゲーム中の一つの場面(Scene)を構成するオブジェクトや
その振る舞い、ゲームのルールの集合を シーングラフ としている。
シーングラフ のノードは親子関係を持つツリーで構成される
(\figref{cerium_sg_tree})。
親子関係とは、親オブジェクトの回転や平行移動等の行列計算による
頂点座標の変更が、子オブジェクトにも反映する関係のことである。
これは子に対してスタックに積まれた親の変換行列を掛けることで実現できる。

\begin{figure}[htb]
  \begin{center}
    \includegraphics[scale=0.8]{images/cerium_sg_tree.pdf}
    \caption{SceneGraph}
    \label{fig:cerium_sg_tree}
  \end{center}
\end{figure}

\subsection{Scene ポリゴンの生成}
ゲーム中に登場するオブジェクトは、オープンソースの3Dモデリングツールである 
Blender[16] を用いる。Blenderで記述したポリゴンオブジェクトを、スクリプトを用いて座標やテクスチャ 
イメージを埋め込んだ xml ファイルとして出力する。

\section{レンダリングエンジン} \label{sec:cerium_rendering}

レンダリングエンジンは、主に3つのタスクで構成されている。シーングラフから、実際に表示するポリゴンの抽出するCreatePolygonFromSceneGraph.
ポリゴンから Span の生成するCreateSpan.
Span に RGB をマッピングし描画するDrawSpan.
抜き出したものである。Ceriumではシーングラフからレンダリングに至るまでに以下で示すような流れがある。\\\\\\

 \\
    1.SceneGraphから、SPEのLSに収まるサイズのSceneGraphPackを生成する。\\
    2.SceneGraphが持つ情報から、Polygonの座標を計算し、PolygonPackを生成する。\\
    3.PolygonPackから、同じY座標を持つ線分の集合SpanPackを生成する。\\
    4.Spanに対応する、描画に必要なTextureをSpanPackに付与する。\\
    5.SpanPackとTextureをZ Bufferを用いて描画する\\


\begin{figure}[htb]
  \begin{center}
    \includegraphics[scale=0.8]{images/rendering3.pdf}
    \caption{シーングラフからレンダリングまでの流れ}
    \label{fig:rendering}
  \end{center}
\end{figure}

\subsection{CreatePolygonFromSceneGraph} \label{sec:cerium_rendering_ceatepolygon}
CreatePolygonFromSceneGraph タスクはシーングラフをもとに、モデリングデータからポリゴンを生成するタスクである。
シーングラフによって生成されたオブジェクトは、それぞれ自身のモデリングデータに対してのIDと変換行列をもっている。
オブジェクトのモデリングデータの頂点をIDを用いて参照し、変換行列を適応させ描画対象となるポリゴンを生成している。

\begin{figure}[htb]
  \begin{center}
    \includegraphics[scale=0.8]{images/CreatePolygon.pdf}
    \caption{シーングラフをもとにモデリングデータからSpanの生成}
    \label{fig:createpolygon}
  \end{center}
\end{figure}

\subsection{CreateSpan} \label{sec:cerium_rendering_create_span}
CreateSpan タスクはシーングラフをもとに取得したポリゴンからSpanを生成するタスクである。Span とはポリゴンを横一直線に切り取った、y座標毎のデータである。1つのポリゴンは三角形であり、まずその三角形を二等分する。そののちそれぞれの三角形をSpanに分割する。

\begin{figure}[htb]
  \begin{center}
    \includegraphics[scale=0.5]{images/createspan1.pdf}
    \caption{ポリゴンからSpanの生成}
    \label{fig:createspan1}
  \end{center}
\end{figure}

\subsection{DrawSpan} \label{sec:cerium_rendering_draw_span}

現在、PlayStation 3 の GPU にアクセスする API は公開されていないため、
Cerium ではフレームバッファに描画する。
フレームバッファのアドレスは mmap() で取得できるため、
タスクの出力としてフレームバッファを指定するか、
タスク内で DMA 転送を行えば (\ref{sec:tm_dma}節)、直接描画することができる。

通常の Linux で動作する場合も同様にフレームバッファに描画する。
MacOSX の場合は SDL 経由で描画する。

レンダリングは DrawSpan というタスクで行う。
受け取った SpanPack から Span を取り出す。
Span の端から 1 pixel ずつ見ていき、その pixel の z 座標と Z Buffer を見比べ、
描画するものとをわかれば、対応する RGB 値を書き込む。

また、DrawSpan は分割された画面領域の一部を担当するので、
span がその領域を超えている場合は描画しない。
現在、一つの DrawSpan が描画する領域は 256x8 としている
(\figref{cerium_rendering_draw_span})。

\begin{figure}[htb]
  \begin{center}
    \includegraphics[scale=0.7]{images/cerium_rendering_draw_span.pdf}
    \caption{DrawSpan の担当領域}
    \label{fig:cerium_rendering_draw_span}
  \end{center}
\end{figure}

{\small
\begin{verbatim}

\end{verbatim}
}

タスク終了後、linebuf をフレームバッファに DMA 転送することで、描画が完了する。