Game Engine Gems 1 "Camera-Centric Engine Design for Multithreaded Rendering"の概要
Game Engine Gems 1 "Camera-Centric Engine Design for Multithreaded Rendering"を読みましたので, その概要について書きます.
- この記事では, カメラベースのグラフィクスエンジンについての説明がしてあります.
- まず, D3D9のようなグラフィクスAPIを直接呼ばずに,
- 描画コマンドを準備する.
- 描画コマンド実行する.
といった手順を踏むために, 以下のようなRenderCommand構造体を導入します.
struct RenderCommand
{
// 頂点バッファのハンドル
ResourceHandle VertexBufferHandle;
// 頂点宣言の種類のインデックス
uint32 VretexDeclEnumIndex;
// 三角形の数
uint32 NumTriangles;
// 頂点数
uint32 NumVerts;
// プリミティブの種類
PrimType PrimitiveType;
...
}
- 次に, Cameraクラスと, Cameraクラスとレンダリングターゲットや描画コマンドを持ったRenderViewクラスについて以下のように定義します.
struct Camera
{
Float3 at, up, right;
float aspectRatio;
};
struct RenderView
{
// カメラ
Camera ViewCamera;
// 視錐台
Frustum Frust;
// レンダリングターゲットとなるカラーバッファ
RenderTargetHandle DestColorRTT;
// レンダリングターゲットとなるデプスバッファ
RenderTargetHandle DestDepthRTT;
// 描画コマンド
List<RenderCommand *> RenderCommands;
// グラフィクスAPIへのサブミットの順序を決める型
enum ViewType
{
// シャドウマップ
kVT_ShadowMap = 0,
// リフレクションマップ
kVT_ReflectionMap,
// メインのカメラ
kVT_MainCamera,
// ポストエフェクト
kVT_PostProcessing,
kVT_Count
};
viewType ViewType;
};
- 例えばシャドウマップを使ったシーンのレンダリングを行うときには, シャドウマップ用のRenderViewとメインカメラのRenderViewを作っておきます.
- RenderViewごとのRenderCommandsの準備
- 各RenderViewごとにそのRenderCommandsを準備するときには, カメラの視錐台でカリングを行い, 視錐台内のモデルのオブジェクトごとにRenderCommandsを準備します.
- またモデルのオブジェクトを走査してRenderCommandsを準備する処理を並列化するために, モデルオブジェクトを走査する処理をスレッドセーフにしておきます.
- 各RenderViewのRenderCommandsの実行
- RenderViewの「グラフィクスAPIへのサブミットの順序を決める型」を保存しているviewType ViewTypeのメンバの型に基づいた順に, 描画コマンドの実行を行います.