海外ゲーム技術勉強会#1 OGRE3D

Preview:

DESCRIPTION

海外ゲーム技術勉強会#1で使用したOGRE 3Dに関する発表のスライドです。

Citation preview

OGRE 3D海外ゲーム技術勉強会#1 資料 @minahito

本日のお話

OGREを使う

OGREの拡張性

OGREのレンダリング

Plugin アーキテクチャ/Reference App Layer

OGRE 3DObject-oriented Graphics Rendering Engine

シーングラフベースの描画システム

抽象化によりDirectX/OpenGLに両対応

MITライセンス

ちょっとだけ紹介してます↑

OGRE 3D2001-2002年頃開発開始、2005年リリース

当時まだそれほどジャスティスではなかった STL を多用、主要なジャンプはほぼvtable経由、なにこれ重い!(2001年)→PCの発展で超余裕に

個人ではなくチームでメンバーを刷新しながら開発、コミュニティも充実

OGRE 3D2001-2002年頃開発開始、2005年リリース

当時まだそれほどジャスティスではなかった STL を多用、主要なジャンプはほぼvtable経由、なにこれ重い!(2001年)→PCの発展で超余裕に

個人ではなくチームでメンバーを刷新しながら開発、コミュニティも充実

最近のバージョンでは、毎フレーム解放再確保するようなコンテナは自前の効率の良いアロケータを使うようになっている

OGRE 3D

オープンソースプロジェクトなので特定タイトル向けの設計傾向を極力排除できる

設計>速度(製品作ってご飯食べるわけじゃないから)

Game Engine Architecture などでも紹介

お話ししたいことオブジェクト指向でエンジンを提供すると、なにができて、コード面はどうなっちゃうのか

OGRE はOOの利点をゲームタイトルにおける部分的改造と追加、そしてそのre-useに利用

タイトル非特化フレームワークやエンジンの開発ミッションを背負ってる方の参考情報のひとつに

お話ししたいことオブジェクト指向でエンジンを提供すると、なにができて、コード面はどうなっちゃうのか

OGRE はOOの利点をゲームタイトルにおける部分的改造と追加、そしてそのre-useに利用

タイトル非特化フレームワークやエンジンの開発ミッションを背負ってる方の参考情報のひとつに

描画エンジン的観点では見るべき点は少ないです!

お話ししたいことオブジェクト指向でエンジンを提供すると、なにができて、コード面はどうなっちゃうのか

OGRE はOOの利点をゲームタイトルにおける部分的改造と追加、そしてそのre-useに利用

タイトル非特化フレームワークやエンジンの開発ミッションを背負ってる方の参考情報のひとつに

描画エンジン的観点では見るべき点は少ないです!

得られるものもありますが、今の時期を考えると、 OGRE をじっくり見るより、まずなにより

DX11 を触っておくべき時期だと思います!

OGREを使う本題じゃないのでさらっと

ExampleApplicationExampleApplication は即OGREアプリを作るための簡易フレームワーク

下位ライブラリと明確に分けられている

使わなくても良い

ExampleApplicationExampleApplication は即OGREアプリを作るための簡易フレームワーク

下位ライブラリと明確に分けられている

使わなくても良い 導入開始時のMAINが短いのは使う側にはありがたい

シーングラフの構築

シーングラフの構築

UnityのTransformコンポーネントみたいなもの

MovableObject

エンティティ、ライト、カメラ等はシーンノードの継承クラスではない→ノードにアタッチして使う

アタッチ可能IF : MovableObject を継承

シーングラフノードとMovableObjectを別系統で拡張可能

MovableObject

エンティティ、ライト、カメラ等はシーンノードの継承クラスではない→ノードにアタッチして使う

アタッチ可能IF : MovableObject を継承

シーングラフノードとMovableObjectを別系統で拡張可能

ゲームオブジェクトは自前で定義することになる。これら MovableObject を継承拡張してゲームオブジェクトを定義するというより、コンポーネント扱いして、コンポジットして作るのが一般的。

フレーム前後の処理

FrameEvent の中に⊿時間なども入っている

フレーム前後の処理

FrameEvent の中に⊿時間なども入っている

クラスを書き換えなくて済むし、インスタンス単位で別の処理ができるし、拡張されたクラスに対しても共通のリスナーを食わせられる。

OGREはかなり多くのクラスが専用のリスナーを備えており、前後処理のフックや特定イベントの通知を受け取れる。

OGREの拡張性

OGREの拡張性既存のクラスを継承拡張する

→RenderSystem

→SceneManagerでよくやる

OGREが持っていない機能を単に追加

特定役割のオブジェクトを差し替える(後述)

OGREの拡張性既存のクラスを継承拡張する

→RenderSystem

→SceneManagerでよくやる

OGREが持っていない機能を単に追加

特定役割のオブジェクトを差し替える(後述)

RenderSystem

起動時に環境にあわせてひとつ選択する

+ getSceneManager(name)+ getRenderSystem()+ getRenderManager()+ getMeshManager()

Ogre::Root

Ogre::RenderSystem

Ogre::RenderSystem_GL Ogre::RenderSystem_Direct3D9

OGREの拡張性既存のクラスを継承拡張する

→RenderSystem

→SceneManagerでよくやる

OGREが持っていない機能を単に追加

特定役割のオブジェクトを差し替える(後述)

ゲームによって空間管理やカリングが異なる

標準、BSP、ページベース、四分木、八分木などのシーンマネージャを入手可能

ディアブロタイプ フライトゲーム

SceneManager

レベルに合わせて変更するためにスイッチ可能

+ getSceneManager(name)+ getRenderSystem()+ getRenderManager()+ getMeshManager()

Ogre::Root

Ogre::SceneManager

Ogre::OctreeSceneManager Ogre::BSPSceneManager

Observer/Visitor 再びOGRE全般に行き渡っているポリシー

例) 標準シーンマネージャとOctTreeシーンマネージャでは、異なる型のシーンノードを生成する

SceneNode::Listener を使えばどちらのノードにもフックできる

Visitorも同様の貢献をする(詳しくは後述)

OGREの拡張性既存のクラスを継承拡張する

→RenderSystem

→SceneManagerでよくやる

OGREが持っていない機能を単に追加

特定役割のオブジェクトを差し替える(後述)

OGREの拡張性既存のクラスを継承拡張する

→RenderSystem

→SceneManagerでよくやる

OGREが持っていない機能を単に追加

特定役割のオブジェクトを差し替える(後述)モジュール的に追加するならプラグインがよい

この情報に従ってDLLをロードする

起動したサブシステムは Ogre::Root からアクセス可能

plugin.cfg

pluginとRefAppLayer

pluginはOgre::Rootからアプローチ可能なシステムを追加する共通の段取り

Reference Application Layer ... OGREと3rd Libを強烈に関係させる例(物理エンジンなど)

本日は割愛!(超重要) すみませんすみません...

換装できないものもあるResourceManager はそれ単体の拡張性はあるが、 MyResourceManager 等と取り替えることは不可

TextureManager、MeshManagerなども同様

ただしOGRE内部で依存性の低いサブシステムは「標準のものは使わずに追加したプラグインのものを使う」ことができる

OGREのレンダリング

シーングラフ中の MovableObject から Renderable を収集して描画する

MovableObject ≠ Renderable ... ボリューム、音源、ライト、カメラ、etc...

MovableObject、Renderableはタイトル側で拡張されていることが多いが、インターフェイスを通じて Renderable を集めることができる

抽象化の下でのレンダリング

シーングラフ中の MovableObject から Renderable を収集して描画する

MovableObject ≠ Renderable ... ボリューム、音源、ライト、カメラ、etc...

MovableObject、Renderableはタイトル側で拡張されていることが多いが、インターフェイスを通じて Renderable を集めることができる

抽象化の下でのレンダリング

MovableObject は複数の Renderable を持つことができる(そして持つことになる)。キューの受け入れは1回だが、受け入れ時に複数積むことができる。ソートはお任せ。

Root::renderOneFrame() がキックされて描画開始

+ renderOneFrame()Ogre::Root

Rootは1つ以上のプライオリティ付け済みのレンダーターゲットを抱えてる。

順番に更新

+ renderOneFrame()Ogre::Root

+ update()Ogre::RenderTarget

1...*

レンダーターゲット更新にあたり、ビューポートを1つ以上持ってるので、すべて更新する

+ renderOneFrame()Ogre::Root

+ update()Ogre::RenderTarget

+update()Ogre::Viewport1...*

1...*

レンダーターゲット更新にあたり、ビューポートを1つ以上持ってるので、すべて更新する

+ renderOneFrame()Ogre::Root

+ update()Ogre::RenderTarget

+update()Ogre::Viewport1...*

1...*

このレンダーターゲットとビューポートのアプローチだけを見ても、DX11の特性を生かした対応はこのままでは難しいでしょう。

ビューポートにはカメラが割り振られているので、レンダリングを依頼

+ renderOneFrame()Ogre::Root

+ update()Ogre::RenderTarget

+update()Ogre::Viewport1...*

1...*

+ renderScene(Viewport*)Ogre::Camera?

ビューポートにはカメラが割り振られているので、レンダリングを依頼

+ renderOneFrame()Ogre::Root

+ update()Ogre::RenderTarget

+update()Ogre::Viewport1...*

1...*

+ renderScene(Viewport*)Ogre::Camera?

このカメラはシーンマネージャによって型が異なる可能性がある。

カメラは自身のクリエイターであるシーンマネージャと協働でレンダリングを開始する

+ renderOneFrame()Ogre::Root

+ update()Ogre::RenderTarget

+update()Ogre::Viewport1...*

1...*

+ renderScene(Viewport*)Ogre::Camera

+ renderScene(Camera*, Viewport*)Ogre::SceneManager?

シーングラフ中の MovableObject から、 SceneManager のポリシーでカメラから見えている Renderable を収集

空の RenderQueue が、 Renderable をエンキューしてもらう旅に旅立つ(始発駅: ルートノード)

カスタム RenderQueue を作って差し替え可

RenderQueue

シーングラフ中の MovableObject から、 SceneManager のポリシーでカメラから見えている Renderable を収集

空の RenderQueue が、 Renderable をエンキューしてもらう旅に旅立つ(始発駅: ルートノード)

カスタム RenderQueue を作って差し替え可

RenderQueue

RENDERQUEUEはエンキュー時にソートを行う

シーングラフ中の MovableObject から、 SceneManager のポリシーでカメラから見えている Renderable を収集

空の RenderQueue が、 Renderable をエンキューしてもらう旅に旅立つ(始発駅: ルートノード)

カスタム RenderQueue を作って差し替え可

RenderQueue

RENDERQUEUEはエンキュー時にソートを行う

この話です

QueueへのVisitor(おまけ)

Ogre::QueuedRenderableVisitorOgre::RenderQueue

+ acceptVisitor()Ogre::QueuedRenderableCollectionxxxVisitor

↑やっぱこれも差し替え可能

VisitorにRenderableが渡された先からカメラが割り振られているので、レンダリングを依頼

最後に

まとめExampleApplication のようなフレームワークは任意導入なのであると嬉しい

Observer と Visitor で各クラスの責任範囲をシンプルにしたまま、その方向性で拡張できる

DX11の威力発揮が難しい設計とはいえ、描画シーケンスは基底クラスに手出しすることなく、短いコードで深いカスタマイズができる

Reference Application Layer

アニメーションシステム

描画上の”レイヤー”とその制御方法

リソースマネージャ

ゲームエンジンアーキテクチャにちょい情報有

今日やらなかった重要話

Reference Application Layer

アニメーションシステム

描画上の”レイヤー”とその制御方法

リソースマネージャ

ゲームエンジンアーキテクチャにちょい情報有

今日やらなかった重要話

また機会があれば!

問題点

抽象化のベースモデルが Direct X8 の時代からさして進んでない

メニーコアや GPU オフロード

描画トリック

例) Deferred + Forward, ベロシティマップ, etc...

おまけ話DX11 への(効果的な)対応策を打ってくると信じており、設計を楽しみにしています

Ogreはアプリ側やプラグイン側でも計算コードが畳み込まれるようにインライン関数が非常に多くなっています

のけぞらないように……

ご静聴ありがとうございました

Twitter: @minahito

Recommended