【Unity】Terrainで木の影をベイクする
今回はTerrainで「木の影」をベイクする方法についてです。
木の影をベイクしたい
影はほとんどの場合、描画範囲を広くすれば広くするほど汚くなります。これは逆に描画範囲を狭くすれば狭くするほどに、1ピクセル辺りに使える影のサイズが増えるので綺麗に出来ます。とは言え、影を近距離しか描画しないと、遠距離の影の表現が無くなってしまい、ソレはソレで残念な表現になってしまいます。
ということでShadow Mask
のDistance Shadow
を使用して、20mの範囲はリアルタイムな影を、20mより先は低解像度なShadowMaskを使用するというアプローチを考えてみます。これで、比較的広いマップでも割りかし綺麗な表現が期待出来ます。
木の影がベイク出来ない
さて、Shadow MaskをTerrainの木に適応したい所ですが、上手く影が焼けません。地面は普通に影を焼けるのですが、木から落ちる影を焼くことは出来ないといった状態です。これは特に多くの木を置いたりすると、非常に目立ちます。
対策
Terrainの木を生成するとき、SpeedTreeで生成したアセットを直接指定すると、上のような結果になります。これはLightmapのstaticが入っていないからです。なので、木のオブジェクトにLightmapのstaticを設定してやります。
- SpeedTreeのアセットを選択(TerrainのTree>木を選択>Editが手っ取り早いです)
- SpeedTreeのアセットをシーンに配置→Projectビューに配置でPrefab化
- PrefabのLightmap staticを有効にする。特にRootオブジェクトは必ずLightmap staticを有効にする
- TerrainのTreeのEditで、Terrainが表示する木をPrefabに差し替える
- ライトマップを焼く
これで木の影がベイクされます。影が表示されない場合は、ライトマップの解像度が低いのかもしれません。設定を少し上げておきます。
感想
Terrain試してた時に「そういえばコメントで名無しさんが補足してくれたな」と思い出して、やってみました。 コメント感謝です。