banner
Olimi

Olimi

SCUT 小菜鸡
github
bilibili

3Dゲームエンジン入門コース4-シーンのレンダリング

はじめに#

このコラムの内容は、学堂オンラインの 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 クラスのレンダリング操作:

  1. SceneManager::_renderScene(Camera *camera, Viewport *vp, bool includeOverlays)
    画像の説明をここに挿入

  2. SceneManager::_renderVisibleObjects(void)
    画像の説明をここに挿入

  3. SceneManager::renderVisibleObjectsDefaultSequence(void)
    画像の説明をここに挿入

  4. SceneManager::_renderQueueGroupObjects(RenderQueueGroup *pGroup, QueuedRenderableCollection::OrganisationMode om)
    画像の説明をここに挿入

  5. SceneManager::renderBasicQueueGroupObjects(RenderQueueGroup *pGroup, QueuedRenderableCollection::OrganisationMode om)
    太字スタイル画像の説明をここに挿入

  6. SceneManager::renderObjects(...);
    QueuedRenderableCollection::acceptVisitorGrouped(...)
    QueuedRenderableCollection::acceptVisitor(...);
    画像の説明をここに挿入

  7. SceneManager::SceneMgrRenderableVistor::VISIT(Pass *p, Renderable *r);
    画像の説明をここに挿入

  8. SceneManager::renderSignleObject(...)
    画像の説明をここに挿入

  9. SceneManager::_issueRenderOp(...)
    GLRenderSystem::_render (RenderOperation &op)//OpenGL を使用してレンダリング画像の説明をここに挿入

上記のステップのまとめ:

画像の説明をここに挿入

Panda3D のシーンのレンダリング#

Panda3D のレンダリングプロセス:

画像の説明をここに挿入

Panda3D のレンダリングの中心となるクラスとクラスの関係:
画像の説明をここに挿入

以下はいくつかの Panda3D のシーンのレンダリングの中心的なクラスの詳細な説明です:
画像の説明をここに挿入
画像の説明をここに挿入
画像の説明をここに挿入

Panda3D のレンダリングの管理:

  1. アプリケーションの起動時にレンダリングを開始します。

  2. 視錐体に対して、見えないオブジェクトをカリングし、レンダリングキューとステートを構築し、ソートします。

  3. レンダリングを実行し、フレームのレンダリング結果を取得します。

  4. アプリケーションはシーンを更新し、次のフレームのレンダリングを開始するためにループに入ります。

Panda3D のメインレンダリングフロー:

画像の説明をここに挿入
画像の説明をここに挿入

以下はいくつかのサブプロセスです:

  1. 非同期タスクによるレンダリングのフロー:
    画像の説明をここに挿入
  2. マルチスレッドレンダリング:
    画像の説明をここに挿入
  3. カリング操作
    画像の説明をここに挿入
  4. レンダリング操作
    画像の説明をここに挿入
読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。