Unityでオクルージョンカリングを使う

今回はオクルージョンカリングを使ってみます。

Unityでは標準でフラスタムカリングという機能が働いているようです。

このフラスタムカリングはカメラの描画範囲内にあるゲームオブジェクトだけを表示し描画にかかる処理負荷を減らしています。

この場合はカメラに描画されている前面だけではなく後ろにあるゲームオブジェクトも表示されていることになります。

一方、オクルージョンカリングを有効にするとカメラの描画範囲のカメラが写している部分である前面のゲームオブジェクトのみを描画し処理負荷を減らします。

この場合はカメラで見えている部分の後ろは描画しないので処理負荷がさらに減らされます。

スポンサーリンク

オクルージョンカリングを使ってみる

文章だけではわからないと思うのでサンプルを作成しオクルージョンカリングの効果を確認してみます。

サンプルのゲームステージの作成

まずはサンプルのゲームステージを作成します。

ヒエラルキー上で右クリック→Create Emptyを選択し、名前をStageとします。

その子要素に右クリック→Terrainを選択しデコボコの地形を作成します。

テラインに関しては

UnityのツールであるTerrainを使ってゲームに使用するフィールドを作成していきます。

を参照して作成してください。

今回はサンプルの為に力を入れて作る必要はないです(‘_’)

Stageの子要素に右クリック→3D Object→Cubeを二つ作成しそれぞれTerrainの地形を遮るようにScaleを変え大きい壁にします。

片方はWallという名前にし、もう片方はTransparentWallという名前にしインスペクタでMesh Rendererのチェックを外して透明な壁にします。

Mesh Rendererのチェックを外し透明にする

↑のようにMesh Rendererのチェックを外しておきます。

サンプルゲームステージの階層

作成したサンプルゲームステージは↑のような階層になります。

サンプルゲームステージ

実際のゲームステージは↑のような感じになりました。

ゲームオブジェクトの設定をする

オクルージョンカリングを行うゲームオブジェクトにするにはそれぞれ設定をする必要があります。

TerrainのStaticにチェックを入れる

TerrainはStaticにチェックを入れStatic関連のすべてのチェックが入るようにしておきます。

OcculuderとOcculudeeにチェックを入れる

WallはOcculuderとOcculudeeにチェックを入れます。

今回はサンプルなのでStatic全体ではなくこの二つにチェックを入れます。

Occuluderは他のゲームオブジェクトを遮蔽するものでオクルージョンカリングを有効にした場合このチェックがあるゲームオブジェクトが見えない場合は描画しないようにします。

Occuludeeは他のゲームオブジェクトに遮蔽されるものでカメラと自分の間に遮蔽するゲームオブジェクトがあった場合はこのゲームオブジェクトは描画されません。

Wallは見える壁なのでOcculuderとOcculudeeにチェックを入れどちらも行うようにします。

Occuludeeだけチェックを入れる

TransparentWallは透明な壁なので自身の後ろにあるゲームオブジェクトはオクルージョンカリングを有効にした場合も描画される必要があります。

その為、TransparentWallはOcculudeeのみにチェックを入れます。

オクルージョンカリングする部分をBakeする

個々のゲームオブジェクトの設定が終わったので、次はオクルージョンカリングをBakeします。

occlusion cullingウインドウを開く

UnityのメニューからWindow→Occlusion Cullingを選択しオクルージョンカリングウインドウを表示します。

オクルージョンカリングのBake設定

Bakeタブを選択し設定をします。

Smallest Occuluderはカリングする最小のオブジェクトのサイズを指定します。

画像では5となっているので例えばCubeを作成しScaleを全て1としていたらOcculuder Staticにチェックが入っていても他のゲームオブジェクトを遮蔽しないみたいです。

Smallest Holeはオブジェクト間の最小の隙間を指定します。

Backface Thresholdは目に見える裏面を積極的に省くかどうかの設定みたいです。

デフォルトでは100になっており、最小で5が指定出来ます。

5だと積極的に目に見える裏面を省いていくみたいです。精度の設定みたいなものでしょうか?

とりあえずSmallest Occuluderを1にして下の方にあるBakeボタンを押します。

オクルージョンされるセルが表示された

↑のようにSceneタブでOcclusion CullingをEditモードにするとオクルージョンカリングされる空間がセルに分割されて表示されます。

オクルージョンカリングするエリアを手動で設定

さきほどOcclusion Cullingの設定をしてBakeボタンを押しましたが、オクルージョンカリングするエリアを設定していませんでした。

エリアを設定せずにBakeした場合はシーン全体にオクルージョンカリングが適用されるようです。

今度は手動でオクルージョンカリングのエリアを作成し設定もしてみましょう。

ヒエラルキー上で右クリック→Create Emptyをしてゲームオブジェクトを作成し、インスペクタのAdd Componentを押してRendering→Occlusion Areaを選択します。

オクルージョンエリアのサイズを調整

Occlusion AreaのサイズやCenterを調整しカメラが移動するであろう地形をカバーするように設定します。

オクルージョンエリアが設定出来た

↑のようにエリアを設定しました。

空のオブジェクトにコンポーネントを追加するやり方以外にもヒエラルキー上にOcclusion Areaが存在しなければOcclution Cullingタブを選択し

Occlusion CullingからOcclusion Areaを作成

ObjectタブのOcclusion Areasを選択しCreate NewのOcclusion Areaを押せばヒエラルキーにOcclusion Areaが作成されます。

エリアサイズの設定等は先ほどと同じです。

エリアを実行時にオープンしたりクローズしたり出来るOcclusion Portalというのもあります。

こちらはスクリプトからも操作出来るみたいですね。

オクルージョンカリングされるか確認する

オクルージョンカリングの設定とBakeが完了したのでカメラを移動してオクルージョンカリングされるかどうか試してみましょう。

SceneタブでVisualizeに変換

↑のようにSceneタブに表示されているOcclusion CullingのウインドウでEditからVisualizeに変換します。

または、

Occlusion CullingタブでVisualizeに変換

Occlusion CullingタブのVisualizeタブを選択します。

これでSceneタブでカメラをオクルージョンカリングされるエリアで動かせば見えない部分を描画しないようになります。

カメラを動かして確認してみましょう(Unityの実行ボタンを押す必要はありません)。

オクルージョンカリングサンプル

カメラを壁の方向に動かしていくとフラスタムカリング効果で地面が描画されていない場所が増えていきます。

壁の前には透明な壁がありますがOcculuder Staticにチェックを入れていない為後ろの壁はずっと見える状態ですね。

また壁の後ろの地面は見えない領域の為に描画されないようになっています(オクルージョンカリング効果)。

カメラを壁の前に置いた状態でSceneタブに表示されているOcclusion Cullingのウインドウ内の設定のOcclusion Cullingのチェックを入れたり外したりすると

効果が単純に確認出来ます。

オクルージョンカリングの効果を数値で見てみる

オクルージョンカリングが効いているかどうかは視覚的に確認出来ましたが、実際に描画の処理負荷が軽減されているかどうかも数値で確認しておきましょう。

まずは違いがよく出るようにTerrainの幅を長くし、オクルージョンカリングした時に隠れる部分が大きくなるようにします。

実験の為Terrainを長くする

↑のように壁の後ろに長くなるように設定しました。

次にグラフィックのクオリティ設定を上げます。

UnityメニューのEdit→Project Settings→Qualityを選択しQualityでFantasticを選択します(よくわからない方は変更しない方がいいかも)。

QualityをBeautifulにする

↑のようにFantasticを選択します(Defaultは変えてません)。

次にGameタブでStatsを押しパフォーマンスデータが見れるようにします。

Statsを表示する

↑のように表示されました。

これはオクルージョンカリングのBakeをする前のデータになります。

オクルージョンカリング前

↑がオクルージョンカリング前の描画される部分です。

オクルージョンカリングの設定をしてBakeします。

オクルージョンカリング後のデータ

↑がオクルージョンカリング後のデータです。

オクルージョンカリング後

↑がオクルージョンカリングされて壁の後ろが描画されていない状態になります。

前後の比較が大変なので画像を並べて比較してみます。

オクルージョンカリング前後比較

↑がオクルージョンカリングの前後の結果の違いです。

赤い四角で囲まれた部分で効果が出ているのがわかります。

オクルージョンカリングを使ってみて

今回オクルージョンカリングを使って実験してみましたが、実験サンプルのゲームステージが実用的なものでないので効果のほどがあんまり実感出来ないかも(^_^;)

もう少し複雑な建物とかを設置して試してみたらよかったかもしれませんね。

今回の記事はUnityのマニュアルを参考にさせて頂きました。

Unity のマニュアルは、Unityの使い方を学ぶ手助けとなります。Unityを使って 2D や 3D ゲームを作成したり、ゲーム以外のアプリを作成したりして多くの経験を積みましょう。
スポンサーリンク

記事をシェアして頂ける方はこちら

フォローして頂くとやる気が出ます

コメント

  1. K.I より:

    すいません、いまオープンワールドのゲームを作ろうとしているんです。

    そこで質問なんですが、たまにオープンワールドのゲームで遠景が絵の様になっている物がありますよね。
    あれはunityで再現出来ますか?

  2. K.I より:

    すいません、追記します。

    地形を作るのですが、terrainではなくゲームオブジェクトで作ろうと思います。
    (地形モデルを別アプリで作成、unityへインポート、といった形です)
    それと、もし方法があるのであれば、岩や木なども絵の様に表示したいです。

    オブジェクトの近くに居る時は普通にオブジェクトとして表示、遠くにある場合は絵の様に表示といった事は出来ますでしょうか?

    長くなりました。失礼します。

    • どういったものか見た事がないのでお応えする事は出来ませんが、単純にフォーカスをぼかすという事はUnityの機能で出来るようですね。

      Depth of Field

      オブジェクトが遠くなった時はPlaneなどに設定した背景画を表示するならカメラのCulling Maskを使ってはどうでしょう。

      ある領域に突入したらカメラのCulling Maskの設定を変えて通常のゲームオブジェクトを見えないようにし、Plane等の背景画を見えるようにします。

      またはレンダーテクスチャを使うとカメラの描画範囲をテクスチャとして更新する事が出来るのでそれをPlane等に設定すれば背景画をテレビ画面のように表示する事も出来ますね。

      どんなものなのかわからないのとわたくしの能力ではこの答えが精一杯ですね(-_-)

  3. K.I より:

    わかりました、Depth of Fieidですね。

    調べてみます。
    分からない事がまたコメントさせて頂きますのでよろしくお願いします。

    • わたくしの作業も進めていこうと思い、今後は質問への積極的な回答は控えさせて頂こうと思います。(-_-)

      まぁあまり有用な回答が出来ているわけではありませんが(^_^;)

      これからは記事での還元という形を取らせて頂きますのでご了承をお願い致します。