はじめに#
このコラムの内容は、学堂オンラインの MOOC「3D ゲームエンジンアーキテクチャ設計基礎」の内容です。個人的には、テキストと画像のバージョンに変換しました(個人的にはテキストバージョンのチュートリアルの方が好きで、読む速度がはるかに速いです)。参考リンク:3D ゲームエンジンアーキテクチャ設計基礎。
シーンのレンダリング#
レンダリングの概要とカリング方法#
レンダリングの定義:3D ベクトルで表されるシーンを 2D ピクセルで表されるシーンに変換する処理のことで、ゲームエンジンの機能モジュール全体で最も重要な内容です。
関連する概念の説明には、以下が含まれます:
レンダリングの効率を向上させるために、以下の不可視オブジェクトのカリングが使用されます:
-
カメラの位置に基づいて、視錐体の外側にあるオブジェクトをカリングする(バウンディングボックスを使用して行うことができます)
-
視錐体内のオブジェクトの遮蔽関係を判断し、遮蔽されたオブジェクトをカリングする(バウンディングボックスを使用して行うことができます)
-
見えるオブジェクトの裏面をカリングする
レイトレーシングの場合、以下の計算と統合によってレンダリング結果が得られます。
-
ライティング:シーンで定義されたライト、マテリアルなどのプロパティに基づいて、グラフィックライブラリを使用してライティングモデルでシーンをレンダリングします。ライティングモデルには、ローカルライティングモデル、グローバルライティングモデル、ライティングレンダリングアルゴリズムなどが含まれます。ライティングの計算は、光源、三角形の面の法線ベクトル、マテリアルなどのプロパティによって行われます。光源はレンダリングされないため、実際のシーンの計算に使用される属性です。
-
テクスチャ:テクスチャマッピングは、シーンのメッシュモデルのリアルな表現効果を向上させる方法です。テクスチャはピクセルで表され、メッシュモデルと関連付けるためのテクスチャマッピングの形式であり、テクスチャマッピングはリソースファイルであるテクスチャマップと組み合わせて使用されます。.jpg、.tga、.bmp、.png、.tif などがあり、ライティング、シャドウ、エフェクトなどと組み合わせて混合効果を生成することができます。テクスチャマッピングの方法には、マルチテクスチャ、バンプマップ、グロスマップ、プロジェクションマップ、環境マップなどがあります。
-
シャドウ:シーンの深度と立体感を生成することができます。シャドウ領域は、視点位置から見ると見える領域であり、光源位置から見ると見えない領域です。以下は示意図です:
ソフトシャドウの概念は、面光源がオブジェクトに照射される場合、影の領域がソフトシャドウとして表示されることを意味します。つまり、影は完全な影領域と半影領域から構成されます。以下は示意図です:
- 視覚効果:動的な光影効果を生成することができます。通常、ビルボードやパーティクルシステムなどを使用して実現されます。
レンダリングの実装の重要な部分:GPU とシェーダープログラミング:
ゲームエンジンに対する要件:
- LOD
LOD(Level of Detail)は、レンダリング時に、より少ない詳細でより小さな、遠い、または重要ではないシーンオブジェクトを使用することを指します。実装方法には、離散 LOD(静的 LOD)、連続 LOD(動的 LOD)、視点依存 LOD などがあります。
シーンのレンダリングの例#
OGRE のシーンのレンダリング#
OGRE のメインレンダリングループ:
OGRE のメインレンダリングシーケンス図:
OGRE の SceneManager クラスのレンダリング操作:
-
SceneManager::_renderScene(Camera *camera, Viewport *vp, bool includeOverlays)
-
SceneManager::_renderVisibleObjects(void)
-
SceneManager::renderVisibleObjectsDefaultSequence(void)
-
SceneManager::_renderQueueGroupObjects(RenderQueueGroup *pGroup, QueuedRenderableCollection::OrganisationMode om)
-
SceneManager::renderBasicQueueGroupObjects(RenderQueueGroup *pGroup, QueuedRenderableCollection::OrganisationMode om)
太字スタイル -
SceneManager::renderObjects(...);
QueuedRenderableCollection::acceptVisitorGrouped(...)
QueuedRenderableCollection::acceptVisitor(...); -
SceneManager::SceneMgrRenderableVistor::VISIT(Pass *p, Renderable *r);
-
SceneManager::renderSignleObject(...)
-
SceneManager::_issueRenderOp(...)
GLRenderSystem::_render (RenderOperation &op)//OpenGL を使用してレンダリング
上記のステップのまとめ:
Panda3D のシーンのレンダリング#
Panda3D のレンダリングプロセス:
Panda3D のレンダリングの中心となるクラスとクラスの関係:
以下はいくつかの Panda3D のシーンのレンダリングの中心的なクラスの詳細な説明です:
Panda3D のレンダリングの管理:
-
アプリケーションの起動時にレンダリングを開始します。
-
視錐体に対して、見えないオブジェクトをカリングし、レンダリングキューとステートを構築し、ソートします。
-
レンダリングを実行し、フレームのレンダリング結果を取得します。
-
アプリケーションはシーンを更新し、次のフレームのレンダリングを開始するためにループに入ります。
Panda3D のメインレンダリングフロー:
以下はいくつかのサブプロセスです:
- 非同期タスクによるレンダリングのフロー:
- マルチスレッドレンダリング:
- カリング操作
- レンダリング操作