tanaka's Programming Memo

プログラミングについてのメモ。

PBR Desert Landscapeを高速化する

汗人柱さんのこちらの記事 → 【作者セール】ファンタジー系のリアルな3Dモデルが66%OFF〜80%OFF / VRでめちゃくちゃ使えそうな綺麗なワンルームの3Dモデルがなんと無料!(9アセット紹介) - Unity AssetStoreまとめ で紹介されていたPBR Desert LandscapePost Processing Profilesがお値打ちだと感じたので買ってみました。ちょうど、正月休み中に1日ぐらいでゲームを作ろう課題を実施する予定だったので、活用の場所もあるしということで。

本記事は、Unity2017.1.1とUnity2017.2の両方で動作確認しました。

目次

PBR Desert Landscapeの概要

ざっと以下のようなものが雑多に入っているアセットです。

  • Terrain用の 2種類の地面のテクスチャー
  • 大きい岩プレハブ 2種類
  • 普通の岩 1種類
  • 小さい岩 8種類
  • 地面に転がっている石プレハブ 4種類
  • 崖プレハブ 3種類
  • 枯れ木プレハブ 1種類
  • 草プレハブ 1種類
  • サンプルシーン 1つ

サンプルのシーンは以下のような感じです。112x112のTerrainに、各種プレハブを配置して構成されています。

f:id:am1tanaka:20171218222959p:plain

各モデルがテクスチャー、ノーマルマップ、MetallicSmoothnessマップが用意されているので、そのままでも綺麗なモデルです。ポリゴン数は小さい岩で200ポリゴン程度から、大きい岩の2,500ポリゴン程度です。

f:id:am1tanaka:20171218222849p:plain

シーンにUtilityのFPSカウンターを追加しただけで、WebGL向けにビルドしたのが上の画像です。パッと見、見本と影の部分が違います。あと、20fps程度なので、ちょっとこのままだとWebGLでは使えません。この辺りを解決してみました。

明るさの調整

見本はこんな感じです。

https://d2ujflorbtfzji.cloudfront.net/package-screenshot/71f53867-3eaf-45ca-a4df-eb053aba03ce_scaled.jpg

明らかに明るさが違います。これはライトマップのデータがないのが原因でした。アセットにはライトマップのデータが含まれておらず、自動生成も無効なので、自動生成を有効にするか、手動でライトマップを生成する必要がありました。

WindowメニューからLighting -> Settingsを開いて、[Generate Lighting]をクリックすると、ライトマップの生成が始まります。

f:id:am1tanaka:20171218225713p:plain

最初のビルドは凄く時間がかかりますが、生成が完了したら以下のように見本のようになりました。

f:id:am1tanaka:20171219003322p:plain

高速化

次は高速化です。プレハブのポリゴン数は、最大でも2,500ポリゴン程度です。Terrainの方が遥かにポリゴン数が多いので、モデルのポリゴン数は遅い主因ではなさそうです。

となるとエフェクトだろうということで、カメラにアタッチされていたエフェクトを一つずつ解除しながら確認しました。すると、以下のものがうちのPCでは相当遅いことが確認できました。

  • Allow MSAA (ドットを滑らかにする設定)
  • Obscurance (遮蔽物との距離で光の影響を変化させる効果)
  • Ambient Occlusion(角などの狭いところが暗くなる効果)

他には、以下のような設定で速くなりました。

以上で、WebGLで50fpsぐらいになりました。

f:id:am1tanaka:20171218231929p:plain

非力なうちのPCでも30fpsは軽く上回れているので、ゲーム作りには問題なさそうです。

先にポリゴン数は主因ではないと書きましたが、ポリゴン数も勿論影響します。カメラが向いている方向に岩が多かったり、地面が続いていると、画面には表示されていなくても処理速度は落ちます。必要になれば、マップの作り方を工夫したり、描画範囲の制御をすればよいでしょう。

Post Processing Profileの利用

デフォルトのエフェクトは古いし、せっかくPost Processing Profileを購入したので、古いエフェクトを削除して入れ替えてみました。

Post Processing Profileとは、ポストプロセスの定番アセットPost Processing Stackの設定集です。

カメラに設定したコンポーネントに付属のプロファイルをドラッグ&ドロップするだけで、プロの人が調整した画面効果を利用できます。缶ジュース一本奢って、これだけの例をもらえるなら安いものでした。

設定の仕方ですが、今回はカメラに古い設定がされているので、まずはそれを外します。サンプルシーンでは、FPSControllerの子供のFirstPersonCharacterがカメラを持っているので選びます。

f:id:am1tanaka:20171218232922p:plain

Inspectorビューで枠で囲んだコンポーネントが旧式のPost Processing Stackのスクリプトなので、全てチェックを外すか、Remove Componentします。

f:id:am1tanaka:20171218233357p:plain

Nothing SelectedになっているのはAmbient Occlusionコンポーネントです。作業中に元のファイルを消しちゃってこうなっちゃいました。

次に、プロファイルを設定できるように、Add ComponentからEffects -> Post-Processing Behaviourを選択してアタッチします。

f:id:am1tanaka:20171218233712p:plain

これで、カメラに後処理効果を設定できるようになります。ProjectビューのPostProcessing Profilesフォルダー内に沢山設定があります。

f:id:am1tanaka:20171218233857p:plain

1種類のプロファイルごとに、????high, ????low, ????_mediumの3種類の設定が用意されています。highは効果を贅沢に使っている分、実行速度は遅くなります。lowは効果を簡略化して高速化したものです。mediumはその中間です。カメラオブジェクトを選択してから、使いたいプロファイルを、InspectorビューのPost Processing Behaviourにドラッグ&ドロップすれば、プロファイルが適用されて画面が変化します。

f:id:am1tanaka:20171218234259p:plain

プロファイル例

一通り、プロファイルの作例を示します。

Blood

f:id:am1tanaka:20171218235151p:plain

Camera1

f:id:am1tanaka:20171218235110p:plain

Camera_BW

f:id:am1tanaka:20171218235227p:plain

Cinematic

f:id:am1tanaka:20171218235304p:plain

Crazy

f:id:am1tanaka:20171218235344p:plain

Cry

f:id:am1tanaka:20171218235426p:plain

Lomo

f:id:am1tanaka:20171218235459p:plain

Narc

f:id:am1tanaka:20171218235537p:plain

Purple

f:id:am1tanaka:20171218235601p:plain

Realistic

f:id:am1tanaka:20171218235638p:plain

UE

f:id:am1tanaka:20171218235712p:plain

仕上げ

Narcなどの面白いエフェクトもありますが、今回は無難にRealisticを選択しました。うちのPCだと処理速度の都合でlow設定にしました。

最後に、そのままの設定でライトマップを生成すると以下のように明るくなりすぎてしまいました。

f:id:am1tanaka:20171218235924p:plain

流石に光りすぎだろうということで、Lighting設定(WindowメニューからLighting -> Settings)のEnvironment Lightingと、Environment ReflectionsのIntensity Multiplierをどちらも0.5に調整しました。

f:id:am1tanaka:20171219000058p:plain

あと、効果があったか分かりませんが、デフォルトのシーンだと、岩などにstaticが未設定だったので、プレハブにstaticを設定した方がよいかと思います。

以上で完成したのが以下の画面です。

f:id:am1tanaka:20171219000350p:plain

新しいエフェクトの方が効率化されているようで、処理速度は同じか、少し向上しました。反射マップを無効にしましたが、静止物だけならGIで反映してくれるので、影響は感じませんでした。

設定のまとめ

記事中に省略したことも含めて、今回やったことは以下の通りです。

  • 新しいプロジェクトを作成して、PBR Desert Landscapeアセットと、Post Processing Profileアセットをインポート
  • EditメニューからProject Settings -> Qualityを選択して、WebGLのクオリティをUltraに変更
  • WebGLの解像度を800x450ピクセルに設定。その他、ビルドに必要な項目を設定
  • ProjectビューからPBR Desert Landscapeフォルダーを開いて、岩や崖などの動かないオブジェクトを選択して、staticにチェックを入れて静止物に設定
  • WindowメニューからLighting -> Settinsを選択して、以下を設定
    • Environment LightingとEnvironment ReflectionsのIntensity Multiplierをどちらも0.5に変更
    • Lightmap Resolutionを20に変更(ライトマップの計算を速くするため)
    • Ambient Occlusionにチェック(マップに焼くなら実行時の速度には影響しないし)
    • 以上設定したら、[Generate Lighting]ボタンをクリック
  • HierarchyビューからFPSControllerを開いて、FirstPersonCharacterを選択して、Inspectorビューで以下を設定
    • Rendering PathをDeferredに変更
    • Allow MSAAのチェックを外す
    • Flare Layerより下の古いPost Processingエフェクト用のコンポーネントを削除
    • Add Componentボタンをクリックして、Effects -> Post Processing Behaviourを設定
  • ProjectビューのPost Processing Profileフォルダーから、適用したいプロファイルを、カメラのPost Processing BehaviourのProfile欄にドラッグ&ドロップ

まとめ

合計300円程度で、リアルな砂漠のマップと、画面効果を得ることができました。そのままの設定だと非力なPCでは重いですが、画面効果の調整で実用レベルにすることができました。

今回はPost Processing Profileを使いましたが、不要な効果を削除したり、Post Processing Stackを自力で設定すれば、このアセットは無くてもここでやったことはほぼできます。PBR Desert Landscapeだけならそれこそコンビニでジュースを買うレベルなので、使い道があればオススメなアセットだと思います。

参考URLと利用したアセット

assetsale.hateblo.jp