Unity 2018.1にアップデートしたので、フォトグラメトリのFontainebleauデモを眺めてみる

ちょうどキリが良かったので、使用している Unity 2017.4.0f1 から、Unity 2018.1.0f2 にアップグレードしました。

なので [Unity 2018.1 リリース](https://blogs.unity3d.com/jp/2018/05/02/2018-1-is-now-available/) のブログを眺めていたのですが、そこで紹介されていた [Unity におけるフォトグラメトリ ― 現実世界のオブジェクトをデジタルアセットに](https://blogs.unity3d.com/jp/2018/03/12/photogrammetry-in-unity-making-real-world-objects-into-digital-assets/) が面白そうなので、ちょっと試してみました。

# 映像で観る

上記のページにも映像はありますが、以下の YouTube 動画のほうが良いとおもいます。画質をHDモードにして、全画面で鑑賞してみてください。なかなか綺麗ですよね。

* [Fontainebleau - Photogrammetry assets for games using material layering](https://www.youtube.com/watch?v=hCeP_XUIB5U)

# デモで体感する

Windows 64bit 環境の方は [説明](https://blogs.unity3d.com/jp/2018/03/12/photogrammetry-in-unity-making-real-world-objects-into-digital-assets/) ページにある「事前ビルド済のスタンドアロンプレイヤー」をダウンロードして試すのがお勧めです。

サイズは948MBあります。zipファイルを解凍して Fontainebleau44.exe ファイルを実行すればok。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/14f58d75-a72b-d64f-3f81-3242e2e1b995.png)

デモ版は Cinematic / First person / Third person の3種類のモードが選べます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/c48135fb-30c6-2205-240a-36715290986c.png)

Cinematic は先ほどのYouTube映像と同じものです。ただし、ここで選択した表示モード(夜間とか)が他の2つのモードにも影響するようです。なので、まずはこのモードを試し、一番好みの状態にしておくのが良いでしょう。

# Unityでプロジェクトを開く

[説明](https://blogs.unity3d.com/jp/2018/03/12/photogrammetry-in-unity-making-real-world-objects-into-digital-assets/) ページからUnity用のプロジェクトもダウンロードできます。

zipで固めた状態で5.72GBあり、解凍すると13GBを超えるので、ちょっと覚悟が必要です。zipを解凍してできたフォルダをUnityから開くと、以下のような警告が表示され、

![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/b945bbdc-db58-5edf-c1d3-0e10f1a1d41c.png)

この変換で30分ぐらい待たされました…

![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/a5b1f821-60c1-8be3-3100-57499de8f333.png)

SSDで作業したのですが、ウチのPCだとCPUがネックになっている模様。Intel Core i7-4790 なんですがそろそろ限界かなぁ… プロジェクト読み込み直後のメモリ使用量は1.6GBぐらい。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/9c909f7c-cc73-cc8c-5b3a-9ace46b06be2.png)

この時間のかかるのは最初の一回(あと再インポート)だけのようなので、まあ、気長に待つしかなさそうですね。

# Unityでプロジェクトを実行する

プロジェクトを開いた直後はシーンが設定されていないので、メニューから「Load Levels -> Loader」を実効します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/6122f625-7da1-88ed-796d-02b80a862994.png)

すると以下のようなロード用のシーンが設定されます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/ca1bf4c3-5053-5487-b5bc-4d23378b4bcd.png)

ここでプロジェクトを「Play」で実行すると、動的にいくつかのシーンが読み込まれ、デモが再生されます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/f34a5c27-9560-191c-64df-5c5ea119f074.png)

なおこの読み込まれるシーンですが、表示内容によって違います。Cinematicモードで一番左のアイコンを選択し、日中モードにすると以下ですが、

![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/d2d4880b-d986-9155-670b-fbd58c3e7197.png)

二番目の日暮れモードを選択すると以下に置き換わります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/f72124b2-0cea-8c48-f646-899250213a84.png)

# 何が置き換わっているのか

元のページの説明には「ステージは Fontainebleau の森を再現したもので、限られた一式のメッシュとテクスチャ―のみを用いて、LayeredLit シェーダーによってそれらを異なるバリエーションで再利用しています。」とあり、また「このデモでは 3 種類の異なるライティング条件を適用できるようになっており」とあります。

なのでこのように置き換わっているシーンは、シェーダーのバリエーションや、ライティング関連であることが想像できます。

実際、Demo_LI_Day シーンは以下の要素を含んでおり、光源や画面処理に関して設定しているようです。LI は Lighting の略だと思われます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/92e71c48-8998-f760-0fd3-185a362834ab.png)

また Demo_SD_Day シーンは以下の要素を含んでおり、音関係を設定しているようです。SD は Sound の略だと思われます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/e3ced6d9-c7e5-f81b-9585-fc9a9bb49ace.png)

そして共通して読み込まれている Demo_GR シーンが実際のモデルのようですね。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/9ba8271c-cf74-ba13-3305-ac27b5185c5a.png)

いろんな要素の Prefab があって興味深いです。例えば岩をみてみると、5段階のLOD(Level of Detail)モデルが用意されていたり。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/645a06a3-7248-1ee5-9717-9de0ab9d5027.png)

また1つの岩モデルに対してマテリアル/テクスチャなどが複数用意されているあたり、LayeredLit シェーダーとやらが生かされてそうです。もう少し勉強しないと、詳細はわかりませんが…

![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/ee48f551-b2d0-38b8-3b1b-cae0519f38dc.png)

# FPSとTPSモードに関して

このデモではCinematicモードの他に、一人称視点(FPS)と、三人称視点(TPS)のモードがあります。ちなみに私は酔いやすいので、自キャラが表示されるTPSモードのほうが好みです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/1cf21b8f-1ca5-d7a3-5a75-0800db17182b.png)

でもFPSモードだと、要所で解説が出たりするんですよね。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/07c6be59-a76d-6544-0d92-2aafa344d276.png)

で、これらのモードに切り替えても、シーンの構成は変化しないようです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/e9cef0f8-ecb8-7452-7ab6-7d8e92726e6d.png)

で、探してみますと、Video_Timeline シーンで定義されていました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/937f1380-81f8-ab63-6a57-a8b68d6acf74.png)

画面に表示されていたオッサンはChal (Challenger)という名前？だったようです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/b6240faf-0839-2086-c97e-cbe74e3c8caf.png)

# オッサンを変えたい

オッサンだと華がないので、例のUnity-chanアセットを追加して、置き換えてしまおうか！と邪念が芽生えたわけですが…。残念ながら Prefab の段階で既にちゃんと表示されません。当然、シーンに追加しても駄目です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/4a7be2c4-2e6a-f57c-1536-1684fe67a810.png)

他のプロジェクトでは表示に問題ない？気がするので、Unity 2018.1 固有の問題ではなさそうです。このプロジェクトのレンダリングには特別な設定がされていると思われるので、それを解除する必要がある？ような気もしますが。

以下は髪の一部ですが、このシェーダーがうまく動いていないっぽい。左の描画結果がエラーのピンクになっています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/4a363cf0-62ed-d2ee-d983-3172276ee672.png)

本来は以下のように金髪？にならないといけない。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/98fb4f7a-730e-115a-290c-546b624073fd.png)

そんなに凝って無さそうな、ActionCheckシーンの床のシェーダーまでエラーになっています。何らかのプロジェクト設定？か何かが従来のシェーダーの動きを阻害している、と推測しますが…

![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/f97f5ffc-0d8f-9290-cebc-b6f6b8ce672f.png)

残念ながら、今の私の知識ではクイックな解決は無理そうです。誰か助けて！なので、今回はオッサンChalで我慢しておきます…

##5月9日 追記
[軽量レンダーパイプライン](https://blogs.unity3d.com/jp/2018/02/21/the-lightweight-render-pipeline-optimizing-real-time-performance/) のほうで、現状のスクリプタブルレンダーパイプラインに対するコメントとして「mixed mode is not fully supported」とあるので、今回の高画質レンダーパイプラインも、従来のパイプラインに依存したシェーダーとの混在がまだできない可能性が高いです。

であれば、バージョンアップによって混在可能になるまで待ち、が正解かもしれません。

あ、マテリアルごとにいまある高画質対応シェーダーを使ってちまちま設定していけば、動くかもしれませんが。こんな感じで… いや大変すぎるかw

![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/5d365189-30a9-0765-0b01-4d258ddf7e33.png)

##5月9日 追記その2

あらためて整理すると、今回の混乱の原因は「Blog記事を読む順番を間違えた」ということです。たぶん、以下の順番で読むべきだった。

1. [スクリプタブルレンダーパイプラインの概要](https://blogs.unity3d.com/jp/2018/01/31/srp-overview/)
2. [高画質レンダーパイプライン ― ビジュアル品質に重点を置いたパイプライン](https://blogs.unity3d.com/jp/2018/03/16/the-high-definition-render-pipeline-focused-on-visual-quality/)
3. [Unity におけるフォトグラメトリ ― 現実世界のオブジェクトをデジタルアセットに](https://blogs.unity3d.com/jp/2018/03/12/photogrammetry-in-unity-making-real-world-objects-into-digital-assets/)


最初の 1. では Unity の新しい SRP(Scriptable Render Pipeline)の概要が説明されます。それの応用例としてまず軽量レンダーパイプライン(LW RP)と高画質レンダーパイプライン(HD RP)があり、2. の記事が HD RPの説明です。

そして 2. の HD RP における物理レンダリングをベースに、実際の風景を使って作成されたデモが 3. の記事になります。

今回の私の「オッサンを変えたい」で Unity-chan モデルがうまく表示されない、つまり従来のカスタムシェーダーが動かない理由は 2. で説明されていて、

> プロジェクトを Unity 組み込みのレンダーパイプラインから HD RP へアップグレードするための変換ツールもご提供していますが、これは、マテリアルとテクスチャーの簡単な再設定のみを行うものです。ライティング、ポストプロセッシング、シーン設定、グラフィックス設定、**カスタムシェーダー**はすべて修正が必要となります。

私はいきなり 3. だけ読んで試したので、混乱しちゃった。もっと落ち着けよ、ということですな…

# というわけで

以上、見た目が綺麗で楽しそうなデモなので遊んでみたのですが、肝心のシェーダー周りの知識がないので、ほんとうに遊ぶだけで終わってしまいました。

もう少しシェーダー周りを学んで、今後、Unity 2018.1 で実装された新しいシェーダー周りの仕組みを理解していきたいとおもいます。というわけで、チョット物足りないですが、今回はこれにて。

ではでは。