遠景をベイクして、Skyboxにして軽量化する

遠くの景色までつくりこんだワールドは、どうしてもオブジェクトの数が多くなり、処理が重くなってしまいます。
そこで、プレイヤーが近づくことのない遠景はベイクしてSkyboxにしてしまうというテクニックがあります。

同じ景色を3Dモデルで表現した場合とベイクしてSkyboxにした場合で、負荷を比較してみました。
SetPass callsという指標を見ると、ベイクした方が数値が下がっていることが分かります。

これはあくまで一例なので、条件によってはもっと大幅に影響が出る場合や、あまり効果が出ない場合もあります。

一般的に、3Dモデルは基本的に質が高くなる・数が増えるほど負荷が大きくなりますが、ベイクすることでその負荷をなくすことができます。
特に背景に高品質なモデルを大量に置いている場合には高い効果が期待できるでしょう。
今回はそうしたSkyboxのつくり方を解説していきます。

SkyboxとCubemap

ワールドの背景を表現するSkyboxですが、これはCubemapという一定の形式に沿った画像で出来ています。

自分で制作するには高度な技術が必要ですが、既存のSkyboxや3Dモデルを使ってつくった景色をベイクすることで簡単にCubemap画像をつくる方法があります。

Reflection Probe

Unityには周囲の景色の映り込みを表現するReflection Probeという機能があります。
Reflection Probeはある点から見た周囲の景色を画像にベイクして、その画像を表面に反映させることで映り込みを再現しています。

ここで、Reflection Probeが利用する「周囲の景色」はSkyboxと同じCubemap形式になっています。

つまり、Reflection Probeが生成する画像をSkyboxに設定することで、シーンの風景を反映したSkyboxを利用することができるということになります。

実際にやってみる

まず、Skybox作成用のシーンを新しく作成しましょう。

  • Projectウインドウを右クリックして、Create>Sceneを選択します。
  • 新しいシーンをダブルクリックで開いて、遠景のオブジェクトを置いたり、Skyboxを設定しましょう。
    • ※このシーンはワールドとしてアップロードするわけではないので、Spawn Pointなどのコンポーネントは必要ありません。

原点(X, Y, Z座標が全て0の点)から数十~数百m程度離れたあたりを囲むようにオブジェクトを置いていくのがポイントです。
Terrainなどを使って地面もつくっておくといいでしょう。

  • 背景ができたら、設置したオブジェクトをStaticにします。
  • 設置したすべての3Dモデルオブジェクトを選択して、Inspectorの右上の「Static」にチェックを入れます。

Hierarchyでオブジェクトを選択したあと、Ctrlを押しながら別のオブジェクトを選択すると範囲選択することができます。

  • Staticにする際に以下のダイアログが出た場合は「Yes, change children」を選択して全ての子をStaticにしてください。
  • ライトを設置する場合は、ModeをBakedに変更してください。
  • 続いて、原点にReflection Probeを設置します。
  • Hierarchyを右クリック、または上部メニューのGameObjectからLight>Reflection Probeを選択します。
  • 作成できたらInspectorからTransformを確認し、Positionの値を設定します。
  • XとZは0、Yは目線の高さを意識して0~数mほどにするのがオススメです。

Reflection Probeが他のオブジェクトの子になっていない状態で座標を設定してください。

  • Reflection Probeの設定を変更し、Resolutionを大きくします。1024以上であればSkyboxとして自然に見えるでしょう。
  • 遠景を1000m以上の距離まで設置した場合は、描画の最大距離となるClipping PlanesのFarも大きくしてください。

Reflection Probeを設置できたら、次はベイクをおこないます。

  • 上部メニューからWindow>Rendering>Lightingを開いてください。
  • LightingウインドウのSceneタブを開きます。
  • Lighting Setting Assetの欄が「None」になっている場合は、「New Lighting Settings」ボタンを押してライティング設定ファイルを作成します。

Generate Lightingボタンを押してベイクを開始します。設置したオブジェクト数などの条件によりますが、かなりの時間がかかるので注意してください。
※ベイクに関してはこちらの記事も参考にしてください。

ベイクが完了すると、シーンファイルと同じ場所にシーンと同じ名前のフォルダが生成されます。

  • Reflection Probeのベイクに成功していれば、このフォルダの中に「ReflectionProbe-0.exr」というファイルがあります。
  • このファイルのInspectorを開き、Convolution Typeを「None」に変更して「Apply」を押します。
    • ※この設定変更をしないとSkyboxがところどころぼやけたようになってしまいます。

これでSkybox画像の準備はできました。
ワールドのシーンに戻ってSkyboxを設定します。

  • ワールドのシーンを開いたら、シーン上の何もないところにReflectionProbe-0.exrをドラッグアンドドロップします。
  • 自動でSkybox用のマテリアルが生成され、新しいSkyboxが適用されます。

設置したオブジェクトを反映したSkyboxが適用できました。

ワールドとしてアップロードしてみるとこのような感じになります。まるでオブジェクトが置かれているかのように見えますね。こうしたテクニックを駆使することでワールドの負荷を軽くすることができます!

遠景を作り込むとワールドがよりリッチに見えます。
少し手間と時間がかかりますが、こだわる人は試してみましょう。

記事をシェアしてワールド制作を盛り上げよう!