テラシュールブログ

旧テラシュールウェアブログUnity記事。主にUnityのTipsやAR・VR、ニコニコ動画についてのメモを残します。

【Unity】Terrainで木の影をベイクする

f:id:tsubaki_t1:20190219011332j:plain

今回はTerrainで「木の影」をベイクする方法についてです。

木の影をベイクしたい

影はほとんどの場合、描画範囲を広くすれば広くするほど汚くなります。これは逆に描画範囲を狭くすれば狭くするほどに、1ピクセル辺りに使える影のサイズが増えるので綺麗に出来ます。とは言え、影を近距離しか描画しないと、遠距離の影の表現が無くなってしまい、ソレはソレで残念な表現になってしまいます。

f:id:tsubaki_t1:20190219012200j:plain
表示距離120mまで

f:id:tsubaki_t1:20190219012218j:plain
表示距離20mまで

ということでShadow MaskDistance Shadowを使用して、20mの範囲はリアルタイムな影を、20mより先は低解像度なShadowMaskを使用するというアプローチを考えてみます。これで、比較的広いマップでも割りかし綺麗な表現が期待出来ます。

f:id:tsubaki_t1:20190219012332j:plain
Distance Shadow

木の影がベイク出来ない

さて、Shadow MaskをTerrainの木に適応したい所ですが、上手く影が焼けません。地面は普通に影を焼けるのですが、木から落ちる影を焼くことは出来ないといった状態です。これは特に多くの木を置いたりすると、非常に目立ちます。

f:id:tsubaki_t1:20190219013016j:plain
Cubeは影を焼けたのでカメラを離しても表示されるが、木は表示されない

f:id:tsubaki_t1:20190219013543j:plain
奥の森に影が無い

対策

Terrainの木を生成するとき、SpeedTreeで生成したアセットを直接指定すると、上のような結果になります。これはLightmapのstaticが入っていないからです。なので、木のオブジェクトにLightmapのstaticを設定してやります。

  1. SpeedTreeのアセットを選択(TerrainのTree>木を選択>Editが手っ取り早いです)
  2. SpeedTreeのアセットをシーンに配置→Projectビューに配置でPrefab化
  3. PrefabのLightmap staticを有効にする。特にRootオブジェクトは必ずLightmap staticを有効にする
  4. TerrainのTreeのEditで、Terrainが表示する木をPrefabに差し替える
  5. ライトマップを焼く

f:id:tsubaki_t1:20190219015006g:plain
影をベイクする手順

これで木の影がベイクされます。影が表示されない場合は、ライトマップの解像度が低いのかもしれません。設定を少し上げておきます。

f:id:tsubaki_t1:20190219015053j:plain
ちゃんと範囲外の影も表示される

f:id:tsubaki_t1:20190219015417j:plain
近づくと綺麗な影が確認出来る

感想

Terrain試してた時に「そういえばコメントで名無しさんが補足してくれたな」と思い出して、やってみました。 コメント感謝です。

関連

tsubakit1.hateblo.jp