BFT名古屋 TECH BLOG

日々の業務で得た知識を所属するエンジニアたちがアウトプットしていきます。

【VR】【Unity】VRプロジェクト開発とぬるぬる動かすための軽量化!

f:id:bftnagoya:20210517170026j:plain

はじめに

こんにちは! BFTの一三です。
以前、「【VR】初心者必見!VRコンテンツを開発する時に必要なPC環境と重要語句とは」と題して、VRプロジェクトの開発に必要な環境について紹介しました。

今回は、自社のオフィスのワンフロアを再現したプロジェクトを例に、実際のVRプロジェクト開発の工程や最も時間のかかる軽量化という作業についてご紹介したいと思います。

 

VRプロジェクト開発の流れと軽量化について

VRプロジェクト開発には、大きく分けて4つの工程があります。

1. ワールドモデリング

ワールドモデリングとはVRプロジェクトで作成するワールドを作る作業を指します。今回は、前回の記事で紹介したBlenderを用いて、オフィスの間取りなど大枠をワールドモデリングで再現しました。

2. オブジェクトの配置 

ワールドモデリングを終えると次に行う作業がオブジェクトの配置です。オブジェクトの配置とは、作ったワールドの中に実際にモノを置く作業のことを指します。今回はアセットストアで購入した机や椅子などの小物を置きました。

3. ライティング

オブジェクトの配置を終えると次に行うのがライティングです。ライティングとは、オブジェクトに光を当てる作業のことを指し、仕上げの段階で3Dモデルや制作した環境の見栄えを設定することを目的に行います。

4. 軽量化

VRプロジェクト開発で最後に行う作業が軽量化です。VRの場合、ワールドが重くて動かないことがVR酔いを引き起こし健康に害を及ぼす恐れがあるため、軽量化の作業が特に重要です。
軽量化には主にワールドの処理を軽くする方法ワールドの容量を軽くする方法の2つがあります。

軽量化① ワールドの処理を軽くする

まず、Unityで制作された3Dコンテンツには「ドローコール」という概念があります。これは、1フレームで何回CPUからGPUへ描画命令を送っているかを示す値です。ドローコールが増えると処理の回数が増えて、フレームレート(1秒間の動画が何枚の画像で構成されているかを示す単位)が下がり動作が遅くなります。つまりワールドの処理を軽くするにはドローコールを減らす必要があります。
ドローコールを減らす方法は大きく分けて3つあります。

  1. メッシュのベイク
    メッシュとは点・辺・面で構成された3Dオブジェクトのことで、ベイクとはあらかじめテクスチャとして焼き付けることを言います。
    例えば、自社のオフィスのワールドに椅子を並べ最終的に60個の椅子を置いたとき、ドローコールは少なくとも60回以上となり、1フレーム進むごとに最低でも60回の指示がCPUからGPUへと送られて処理されます。しかしメッシュベイクをすることで1個1個並べた椅子を「1つの物体」として固めることができます。イメージとしてはExcelにあるオブジェクトのグループ化に近いです。

    こうすることでドローコールを減らし、実際にワールドにいる際の軽量化つまりフレームレートの向上が臨めます。一方、メッシュをベイクしてしまうと「一つの物体」として認識されるため、「やっぱりこの椅子はもう少し右に移動しよう」と修正することができません。したがって基本的にメッシュベイクはほぼ完全にワールドの形が決まってから行うものとされています。軽量化の作業を最後に行うのも、このような背景があります。

  2. ライトのベイク
    ライトの種類は、3つあります。
    ① 1フレームごとに毎回光の当たり方を計算するRealtime
    ② あらかじめ光の当たり方や影を計算しておいてテクスチャに焼き込む
    ③ BakedRealtimeとBakedの混合ライトであるMixed

    ここではMixedライト以外の2つについて説明します。Realtimeはその名の通り1フレームごとにライトの当たり方や影をCPUが計算しその描画処理をGPUに指示します。先ほどあげた「ドローコール」と同様でCPUからの指示が多ければ多いほど負荷がかかりフレームレートが下がってしまいます。つまりRealtimeライトは重くなりやすいのです。
    そこでワールドに実際にいるときにライトの処理を重くしない手段の1つとして、Unity上であらかじめ光の当たり方や影の計算をして、あたかも光が当たっているかのようにテクスチャに描きこんでおくBakedライトを使う方法があります。
軽量化② ワールドの容量を軽くする

ワールドの容量を軽くすることはロード時間を短くすることに繋がります。
ワールドの容量を軽くする方法は主に3つあります。

  1. FBXファイル(3Dのファイル形式)の圧縮設定を変更
    アセットフォルダ内に存在しているFBXファイルのInspectorから「Mesh Compression」の値を変更します。初期値はOffで、LowよりもMedium、MediumよりもHighの方が圧縮率が高く容量を小さくできます。
  2. テクスチャの圧縮
    Unityの設定画面からオブジェクトのテクスチャを圧縮することでワールドの容量を軽くできます。ただテクスチャを圧縮すると画像が汚くなってしまうため、目立たない場所やクオリティを求めないオブジェクトのテクスチャを下げることをお勧めします。
  3. Dynamic Materialsの数を減らす
    ワールド内に存在しているマテリアルの数のことを「Dynamic Materials」といいますが、これを減らすこともワールドの容量を軽くすることにつながります。

実際の開発の様子

ここからは実際のプロジェクトの様子を写真を交えて紹介します。今回のプロジェクトは自社のオフィスのワンフロアを再現するもので、ワールドモデリングに1週間、オブジェクトの配置に1週間、軽量化に2週間の合計4週間で完了させる計画で始まりました。

<2週目終了時の仮想オフィスの様子>
2週目終了時では、先程紹介したワールドモデリングと机や椅子などの小物を置く作業が一通り完了した段階まで進みました。ただ、壁など配置が終わっていないものもあり、予定していたオブジェクトの配置が完了するところまでは至りませんでした。

f:id:bftnagoya:20210517162550p:plain

f:id:bftnagoya:20210517162623p:plain

<3週目終了時の仮想オフィスの様子>
3週目終了時点では大まかなオブジェクトの配置が終わり、アセットストアになかった家具をモデリングで作成して設置しつつ、床や壁のテクスチャ設定などを完了させました。また、仮置きしていた壁を本来のガラスのように透き通った状態にもできました。この時点で前の週から発生していた遅れはほぼ解消されました。

f:id:bftnagoya:20210517162804p:plain

f:id:bftnagoya:20210517162831p:plain
<現在の状況とこれから>

3週目終了時から大きく変化したことは3つあります。まずリフレクションプローブ (Reflection Probe)を設置し、光源としてPoint Lightを設定しました。リフレクションプローブとは、「反射」を疑似的に表現する機能の1つです。リフレクションプローブを設定することで、鏡のような金属的な反射を表現することができます。

また、光源としてPoint Lightを設定することで、焚き火の炎の明るさのような自然な明るさが表現できます。次に下の写真の赤枠内のように動画再生プレイヤーを設置しました。

f:id:bftnagoya:20210517163008p:plain

 

そしてワールドの容量を減らすために前述したテクスチャの圧縮を行いました。現在はアニメーションを勉強中でドアの開閉の動きなどを再現していきたいと考えています。

f:id:bftnagoya:20210517163044p:plain

終わりに

今回は実際のVRプロジェクト開発の工程と軽量化についてご紹介しました。今回のVRプロジェクト開発では元々興味のある内容を学ぶ機会が得られたので、非常に楽しく作業できました。初めて経験する作業でしたが、当初の予定通り進められたことも大きな自信になりました。
VRの質の高さはVRバイスを通してみないとわかりにくい部分も多々あり、写真ではなかなか体感しにくいと思います。読者の皆様にはぜひVRバイス(特にOculus Quest 2)を手に入れていただき、体感していただきたいと思います。VRの世界の無限の可能性を感じていただけると思います。

今回の記事は、以上とさせていただきます。
最後まで読んでいただき、ありがとうございました。