3DTextureを使ってリアルな霧を再現しよう!

今回はHDRPのDensity Volumeで使用する、3Dテクスチャについての解説です。
下記のリンクからSBSARファイルのサンプルもダウンロードできますので、ぜひ動画を参考にチャレンジしてみてください。

ダウンロード

HDRPのボリュームフォグでは、Density Volumeを使う事により、 3D空間に、体積と密度を持ったリアルな霧を再現する事ができます。
Density Volumeは、インスペクタから任意の3Dテクスチャを指定することで、霧の濃さに粗密をつける事もできます。
これは止まった状態では効果がわかりにくいものですがスクロールアニメを使って動かすととてもリッチな表現となります。

ここに用いるテクスチャは、unityの独自形式による三次元のノイズテクスチャです。
テクスチャはXYZの全方向にタイリングされておりインスペクタの項目、スクロールスピードで各方向へのスクロール速度、タイリングでテクスチャのスケールを調整することができます。
またフォグディスタンスの設定によって、全体の濃度をコントロールする事もできます。

3Dテクスチャの作り方

この3Dテクスチャ、どのように作るかについて、現在はあまり丁寧な説明がされていません。
Unityのドキュメントで3Dテクスチャを検索すると、コーディングでテクスチャを生成する方法のみがヒットします。実際に2D画像から3Dテクスチャを生成する事はできます。 ただし、この機能はHDRPだけのものなので、HDRPパッケージのドキュメントにしか載っていません。ここに書かれているDensity Volume Texture Tool を使う事で、任意の2D画像から3Dテクスチャを生成する事ができます。

ただ、これに用いる2Dテクスチャを用意するのも、残念ながら少し手間が掛かります。
このツールには1024×32ピクセル、各チャンネル8ビットのTGA形式だけが使用できます。

この変わったサイズのテクスチャは書き方に特定のルールがあります。
まず32×32×32ボクセルの3Dノイズを想像してください。これをZ方向に1ボクセルずつ輪切りにします。

そうして出来た32枚のスライスを、X方向に順番に並べたものが、この2Dテクスチャです。

理屈は簡単ですが、実際にこのようなテクスチャを作る方法はいくつかに絞られると思います。

私がお勧めするのは、Substance Designerを使った方法です。
Substance Designerには始めから3Dノイズの概念があるので、これを上手く加工すれば少ない手順で求める2Dテクスチャが得られます。私も、ピクセルプロセッサーなどは使わずに、これだけのノードで作ることができました。

Substance Designerで作ったテクスチャはSBS、SBSAR形式で保存することで、その後もいろいろなツールで、パラメータを調整することができます。
今回はSBSARファイルのサンプルを用意しましたので、以下のボタンからダウンロードしてお使いいただけます。

ダウンロード

このサンプルファイルから、Substance Playerを使って2Dテクスチャを生成する方法を説明します。
ダウンロードしたSBSARファイルをSubstance Playerに読み込みます。そうすると以下のように出力結果を確認しながらパラメータを変更する事ができます。

このサンプルでは、スケールとコントラスト、濃度が変更できるようにしてみました。
望んだ結果ができたら、TGA形式で出力すれば、2Dテクスチャの生成は完了です。

Unityへのインポートと設定

この2DテクスチャをUnityのプロジェクトに追加し、インポート設定で単一チャンネルを指定します。

その後ツールにセットしてエクスポートを行うと、Unityの3Dテクスチャが生成されます。

このテクスチャをDensity Volumeにセットすると、フォグの粗密が再現されます。

また今後のアップデートでは、Density Volume Texture Toolはテクスチャインポート設定に統合され、2Dのスライステクスチャを直接3Dテクスチャとして読み込むことができるようになる予定です。

最も簡単に3Dテクスチャを利用するには

というわけで3Dテクスチャを自作する手順を解説しましたが、自作にこだわらなければもっと簡単な方法もあります。
Unityの次のバージョンとなる2020.2、この動画の時点ではまだベータ版ですが、このバージョンではHDRPのテンプレートプロジェクトが新しいものに刷新されています。

新テンプレートプロジェクト

このプロジェクトの中に、3Dテクスチャを用いたDensityVolumeが使われているので、そのアセットを自分のプロジェクトにコピーする、それだけです。
DensityVolumeに用いる3Dテクスチャは、シンプルなノイズで十分なので、多くの場合はこの方法だけで事足りるかもしれません。

今回はフォグのDensityVolumeに使用する、3Dテクスチャの作成方法について解説しました。HDRPはUnity本体とマニュアルが分かれているので、機能に疑問が浮かんだら両方のマニュアルを検索してみる事をおすすめします。 ご視聴ありがとうございました。