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

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

Embed Size (px)

DESCRIPTION

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

Citation preview

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

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

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

本日のお話

OGREを使う

OGREの拡張性

OGREのレンダリング

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

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

OGRE 3DObject-oriented Graphics Rendering Engine

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

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

MITライセンス

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

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

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

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

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

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

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

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

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

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

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

OGRE 3D

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

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

Game Engine Architecture などでも紹介

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

使わなくても良い

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

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

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

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

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

シーングラフの構築

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

シーングラフの構築

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

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

MovableObject

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

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

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

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

MovableObject

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

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

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

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

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

フレーム前後の処理

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

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

フレーム前後の処理

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

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

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

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

OGREの拡張性

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

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

→RenderSystem

→SceneManagerでよくやる

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

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

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

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

→RenderSystem

→SceneManagerでよくやる

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

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

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

RenderSystem

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

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

Ogre::Root

Ogre::RenderSystem

Ogre::RenderSystem_GL Ogre::RenderSystem_Direct3D9

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

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

→RenderSystem

→SceneManagerでよくやる

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

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

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

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

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

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

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

SceneManager

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

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

Ogre::Root

Ogre::SceneManager

Ogre::OctreeSceneManager Ogre::BSPSceneManager

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

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

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

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

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

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

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

→RenderSystem

→SceneManagerでよくやる

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

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

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

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

→RenderSystem

→SceneManagerでよくやる

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

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

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

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

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

plugin.cfg

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

pluginとRefAppLayer

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

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

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

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

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

TextureManager、MeshManagerなども同様

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

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

OGREのレンダリング

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

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

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

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

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

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

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

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

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

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

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

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

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

+ renderOneFrame()Ogre::Root

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

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

順番に更新

+ renderOneFrame()Ogre::Root

+ update()Ogre::RenderTarget

1...*

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

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

+ renderOneFrame()Ogre::Root

+ update()Ogre::RenderTarget

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

1...*

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

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

+ renderOneFrame()Ogre::Root

+ update()Ogre::RenderTarget

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

1...*

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

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

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

+ renderOneFrame()Ogre::Root

+ update()Ogre::RenderTarget

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

1...*

+ renderScene(Viewport*)Ogre::Camera?

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

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

+ renderOneFrame()Ogre::Root

+ update()Ogre::RenderTarget

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

1...*

+ renderScene(Viewport*)Ogre::Camera?

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

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

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

+ renderOneFrame()Ogre::Root

+ update()Ogre::RenderTarget

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

1...*

+ renderScene(Viewport*)Ogre::Camera

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

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

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

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

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

RenderQueue

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

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

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

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

RenderQueue

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

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

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

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

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

RenderQueue

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

この話です

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

QueueへのVisitor(おまけ)

Ogre::QueuedRenderableVisitorOgre::RenderQueue

+ acceptVisitor()Ogre::QueuedRenderableCollectionxxxVisitor

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

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

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

最後に

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

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

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

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

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

Reference Application Layer

アニメーションシステム

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

リソースマネージャ

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

今日やらなかった重要話

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

Reference Application Layer

アニメーションシステム

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

リソースマネージャ

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

今日やらなかった重要話

また機会があれば!

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

問題点

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

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

描画トリック

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

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

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

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

のけぞらないように……

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

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

Twitter: @minahito