ForgeVision Engineer Blog

フォージビジョン エンジニア ブログ

【Unity】Amplify Impostors を使って遠景のポリゴン数を削減する

こんにちは。VR事業部の溝田です。

今回はAmplify Impostors について紹介します。(2018/10/22 時点でベータ版です。)

assetstore.unity.com

Amplify Impostorsを用いることで既存の3Dモデルを簡単に多視点対応のビルボードとして生成することができます。これにより少ないポリゴン数で3Dモデルであるかのように見せることができます。実際に使ってみた感覚だと3Dモデルの表現はそのままに、解像度だけを下げたような見た目になるという印象です。

公式のマニュアル(英語)はそこまで文章量が多くないため、簡単に読むことができます。 公式マニュアルはこちらから確認可能です。

Unity Products:Amplify Impostors/Manual - Amplify Creations Wiki

動作環境

今回使用した環境は下記の通りです。

  • Unity2017.4.13f1
  • Amplify Impostors [BETA] 0.9.1

※Amplify Impostorsは Unity2017以降にて使用可能です。

Amplify Impostorsの利用からLOD適用までのクイックスタート

Amplify Impostorsの説明の前に、まず使ってみましょう。

Amplify Impostorsを使って生成したアセットをLODに設定し、オブジェクトが遠くにあるときに生成したアセットに切り替わるようにしていきます。

Amplity Impostorsの利用

今回はAmplify Impostorsアセット内に含まれている樽のモデル(prop_barrel_01)を利用しました。

f:id:d30835nm:20181018142008p:plain

使い方は簡単で、シーン上のゲームオブジェクトに、Amplify Impostor(Script) コンポーネントを追加し、BakeImpostorをクリックします。保存先を聞かれ、ImpostorAssets(メッシュやマテリアル、テクスチャなど)が生成されます。

f:id:d30835nm:20181018160041p:plain

同時にシーン上にImpostorという名前でImpostorAssetsが適用されたゲームオブジェクトが生成されます。 f:id:d30835nm:20181018142334p:plain

LOD適用

次にLODグループを設定するためのゲームオブジェクトを新規作成(Barrelと命名)し、LOD Group コンポーネントを追加します。 そのゲームオブジェクトの子に先程生成したImpostor及び、元々のモデル(prop_barrel_01)を設定します。

Barrelの LOD0 のRenderersにprop_barrel_01、LOD1 にImpostorを設定し、LOD0 100% 、LOD1 20% 、Culled 1%となるように調整します。 f:id:d30835nm:20181018160523p:plain

これで完了です。

作成したBarrelオブジェクトを大量に並べて確認するとこのようになります。

youtu.be

※480p以上の画質でないとStatsの文字が見えない恐れがあります。

Trisの値に注目すると分かりますが、最初1.3Mあったのが、距離が離れるにつれて下がっていき最終的に75.0kまで下がっています。

f:id:d30835nm:20181018164527p:plain

f:id:d30835nm:20181018164550p:plain

赤で囲っている樽が元々のモデル(LOD 0)で、他の樽はImpostors(LOD1)となっています。 また、Impostorsで生成したアセットでも影は反映されています。

Amplify Impostorsの各パラメータについて

f:id:d30835nm:20181018145912p:plain Amplify Impostor(Script) コンポーネントで一度BakeImpostorを押すと、上記の様な表示となり、各パラメータを調整することができます。 下記は意訳の部分もあるので、詳しくは公式のマニュアルを参考にして下さい。

Bake Type

Spherical、Octahedron、HemiOctahedronの三種類から選べます。

Spherical:多視点から撮ったテクスチャを各エリア毎に対応して見せるというものです。綺麗に見える箇所もありますが、エリアが切り替わる部分でガクッとテクスチャが切り替わる印象を受けます。

Octahedron:多視点から撮ったテクスチャを近い位置のものとブレンドして見せるというものです。テクスチャの切り替わりは自然ですが、画像がボケているような印象を受けます。

HemiOctahedron: Octahedronの半球バージョンです。上半球の方向から見られることだけを考慮しており、Octahedronよりテクスチャが有効に使えるため綺麗に見えます。ただし、下半球側から見ると破綻します。

TextureSize

生成するテクスチャのサイズです。大きくすればするほど綺麗にはなりますが、テクスチャ容量が大きくなります。デフォルトの2048で丁度良さそうです。

Axis Frames

生成するテクスチャの軸のあたりのフレーム数です。デフォルトの16の場合は、16×16 =256視点の画像が生成されます。 フレーム数が小さいほど画像の解像度が上がり、フレーム数が大きいほど様々な角度からみたときの見た目が自然になります。 こちらもデフォルトの16で丁度良さそうです。

f:id:d30835nm:20181018151533p:plain

Pixel Padding

テクスチャ生成時の余白です。余白が小さいと、表示するビルボードの端に余計な画像が表示する恐れがあります。デフォルトの32にしておき、ビルボードの端に余計な画像が表示される場合に調整すればよいかと思います。

Billborad Mesh

ビルボードの形状を設定出来ます。

BakePreset

生成するテクスチャの種類などを変更できるようです。

まとめ

遠景になりうるものにImpostorsを利用して、LODを適用するというのが一番手軽でよい使い道かなと考えます。 近いものに適用するのは非常に厳しいと感じました。

設定するパラメータとしては、下半球方向から見ないものはBake TypeをHemiOctahedronに変える程度で、十分だと感じました。使いすぎるとTexture容量が増大していくので、注意が必要です。

VRで見た場合、右目と左目それぞれでビルボードが計算されて表示されるため、近くでみると破綻しますが、性質上近くで使うものではないため有効かと思います。