HDRPでリアルな布を表現する「Cotton/Wool shader」を使ってみました。HDRPの布シェーダーには、「CottonWool」と「Silk」があります。
これらのシェーダーではThread MapとFuzz Mapを使います。スレッドマップはAOとノーマル、Smoothnessが統合されたテクスチャで、ファズマップは毛羽立ちなどを表現するシングルチャンネルのテクスチャです。
テクスチャを用意する
textures.comで布のノーマルマップとラフネスマップ、アンビエントオクルージョンマップをダウンロードしました。この3つからスレッドマップを作りました。
まず、ノーマルマップをフリーソフトのGIMP2で開き、色 > 色要素 > チャンネル分解 をクリックします。
色モデルをRGBにしてOKを押すと、チャンネルごとに3つのレイヤーにわかれます。
さらに、ラフネスマップとAOマップをドラッグアンドドロップで加えます。
ラフネスマップのレイヤーが選択された状態で、色 > 階調の反転 をクリックします。
これでラフネスが反転します。
これらのレイヤーを1つの画像に統合します。そのために、色 > 色要素 > チャンネル合成 を選択します。
色モデルをRGBAにして、その下のドロップダウンで赤チャンネルにAO、緑チャンネルにノーマルの緑チャンネル、青チャンネルにラフネス、アルファチャンネルに赤チャンネルを設定しOKを押します。
すると、スレッドマップができるのでPNG形式などでエクスポートしました。
ファズマップもtextures.comでダウンロードしました。
マテリアルを作る
これらの画像をUnityでインポートして新規マテリアルを作りました。インスペクタのShaderのドロップダウンで、HDRP > Fabric > CottonWoolを選択します。
このシェーダーでは、スレッドマップとファズマップの他に、ベースカラーマップ、マスクマップ、ノーマルマップも使えますが、サンプルではスレッドマップとファズマップしか使われていません。
通常のコットン/ウールの場合、Specular Colorを暗くして、Base Colorで全体の色を設定し、Smoothness Maxを調節するようです。
Specular Colorを明るくすると、こちら側が暗くなりました。
ベルベット
ベルベットを表現する場合は、Base Colorを暗く、Specular Colorを明るくして、Smoothness Maxを高くします。
これで、カメラに向くほうが暗く、その周辺がSpecular Colorになります。
サンプルのベルベットには、スレッドマップとファズマップが設定されていません。
スレッドマップとファズマップを使う
スレッドマップを使うには、Use Thread Mapのチェックを入れます。2つのテクスチャは、Thread MapとFuzz Mapにアタッチしました。
Thread UV Maskでは、スレッドマップに使うUVチャンネルだけ1に、それ以外を0にします。今、Xだけが1になっているので、1つ目のUVマップが使われています。
3つ目のUVマップを使いたいときは、Zだけを1にします。
Thread UV Scale Transformでは、xyにタイリング、zwにオフセットを設定します。その下の3つのスライダーでは、スレッドマップの各チャンネルの値の強さなどを調節できます。
Fuzz Map UV scaleは小さい値にするようです。
Fuzz Strengthで、ファズマップの強さを調節できます。
これで、様々な種類のコットン/ウールのマテリアルを作れました。
サンプルのマテリアルは、スレッドマップの縫い目の模様が大きいためか、縫い目がよりはっきりしているように見えます。
Diffusion Profileを設定する
最後に、Diffusion Profileをアタッチします。サンプルは各マテリアルに別々のDiffusion Profileが設定されていますが、それらの違いはほとんど「Thickness Remap Values」と「Thickness Remap」だけです。