岩のマテリアル

# はじめに
この記事は[Houdini Apprentice Advent Calendar 2022](https://qiita.com/advent-calendar/2022/happrentice)の19日目の記事です。

今回は岩のマテリアル作っていこうと思います。
私のオリジナルではなく、↓のチュートリアル動画を参考にしています。
https://youtu.be/uTPR0cUVRdg
記事にする都合上少し内容を前後させてることもありますが、ほぼ同じものを作っていきます。
また、こちらの動画はパート4にあたるもので、別パートでは岩のモデリングの解説などをしてださっていますので、岩を作りたくて見ていない方はぜひご覧ください！

ノードの値をキャプチャーで載せてますが、写ってないパラメーターはデフォルト値だと思ってください。
Houdiniのバージョンは19.5.368


# オブジェクト
まず質感をつけるためにはオブジェクトが必要ですが、今回はピッグヘッドをsubdivideして適当にノイズを与えたものを使っていきます。
今回の記事の趣旨ではないので詳しい解説はしません。(というより解説できるほど丁寧に作ってないです)
岩を作るときはWorleyノイズを使うとなんとなくそれっぽくなりやすい気がします。
チュートリアル動画の岩のサイズに少し近づけるためTransformノードでUniform Scaleを0.5してます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548340/bfeac9a6-d69b-0080-e30b-522829bb390a.png)

# ライト
ライトはEnvironment Lightだけ使ってます。
↓のHDRIを使用してます。
https://polyhaven.com/a/alps_field
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548340/f301967a-046b-6939-371b-b627f220cf3e.png)

# マテリアル作成
## ベースカラー作成
mat ネットワークに移動し、Principled Shaderを作成します。名前を任意で変えます。今回はrock shaderという名前にしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548340/f21ce66d-b009-3334-40dc-2f6a6b16c370.png)

以下3つのノードを作成します。
**Global Variables
Unified Noise-Static
Ramp Parameter**

↓図のようにネットワークを繋げます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548340/737917c7-4a69-472e-02f9-41d830fd317f.png)

Unified Noise-Staticのパラメーターを変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548340/7e017943-8d2a-0157-3491-a2983f6eee9c.png)

Ramp Parameterはbase_colorという名前に変更し、Nameを$OSにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548340/ede560d6-4620-8e81-6881-15c8e8244557.png)

rock_shaderのRoughnessを0.9にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548340/dc86e318-4ae9-9877-c824-ad06225639c7.png)

ここまででこのような見た目になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548340/451363d6-3e3e-7429-8a31-bf5d9c2f3698.png)


base_colorの色を変えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548340/9d7a5b07-b9e6-3675-60ec-a27a45969cbd.png)

好みの調整でいいと思いますが、参考に実際の設定してみた値を載せておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548340/0d3d7874-a66e-d9ee-d6e0-9d1e6668db49.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548340/8b28c282-2263-b7cb-ff94-c45d567bae81.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548340/d7bbeb05-a703-4c86-c608-999fd9148bde.png)

レンダリング結果はこのようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548340/a1cefece-0902-559d-43c6-a3411bdda4a0.png)


## まだら模様

**Unified Noise-StaticとRamp Parameter**を**複製**します。
複製してできたbase_colorはtint_colorという名前に変えます。
**Color Mix**を作成し、base_colorとtint_colorをつなぎます。
ネットワークは↓図のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548340/8c0d9154-f901-352b-9209-8fb6e0bb2f5f.png)

複製したUnified Noise-StaticのFrequencyとOffsetを変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548340/430c954a-757c-8a7e-d8e9-df11b83147f0.png)

tint_colorの色を変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548340/877d353c-704e-aefb-c532-e4a0e5fe42e9.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548340/0c3ac129-87a8-33b0-7bd9-04c69cab4516.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548340/fe8a68d8-a3d5-2fc1-c818-dcd4f82f11a2.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548340/0307cd44-b2ad-43e1-e3f4-692dd98ccb15.png)

Unified Noise-Staticを新しく作成し、Color Mixのbiasに接続します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548340/69daa632-1ac8-8d9a-98ea-4938c29b7a48.png)


unifiednoise_static3のパラメーターを変更します。Offsetは適当で大丈夫です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548340/5445878a-602e-2a0a-5e35-544238f33d37.png)

ここまでのレンダリング結果です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548340/9b68af29-96d9-4092-e7e7-ab84b2f1ab1a.png)

Color Mixノードをbase_color_outという名前に変更します。ノードに色をつけておいてわかりやすくしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548340/ba1f1b68-3e9a-579e-b1c1-4f19ee79df32.png)

## 岩のエッジの色を変える。

新しく以下のノードを作成します。
**Curvature
Color Mix
Color_Correction**

画像を参考にノードをつないでください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548340/14904dc1-4e12-d662-87fe-d356fc8ea9da.png)

Curvatureのパラメーターを変更します。尖った箇所を検出することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548340/8c7fa5ba-cbd4-7ea8-289e-99c2cbb67f00.png)

Color Mixのパラメーターを変更します。base_color_outの色を参照し、彩度を下げて明度を上げるような処理をしてます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548340/f42d8500-020b-4e39-b8bb-d62e13d4d3ed.png)

レンダリング結果です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548340/758abc43-c9d5-1940-d8df-d69bb481baaf.png)


### エッジを馴染ませる

**Multiply
Unified Noise-Static**
を作成します。

MltiplyにCurvatureとUnified Noise-Staticをつないで掛け合わせます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548340/d3bf67da-59b3-8f6a-73c5-3d2e778f2db9.png)
unifiednoise_static4のposにはGlobal VariablesのPをつないでください。


unifiednoise_static4のパラメーターを変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548340/e6204c6f-e555-a9fb-9830-e788097ff529.png)

レンダリング結果です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548340/8bc2af2b-a9d2-1b5b-141e-14faccab9801.png)


## 岩の窪みを暗くする処理

**curvature1
unifiednoise_static4
multiply1**
を複製します。

**Color Mix
Color_Correction**
を作成します。

ネットワークを↓図のようにつなぎます。
curvature2、unifiednoise_static5、multiply2、colorcorrection2、colormix2が新しいノードです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548340/fe19300e-12b6-19b1-594e-155da6e1bfa0.png)

curvature2は、Convex Scaleを0.05に増やしエッジの検出範囲を広げます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548340/fa49881b-d1c7-ebe4-3897-8d4293d4610d.png)

unifiednoise_static5はoffsetを適当に入れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548340/85b5091d-be4f-456c-5476-4863d534f0c9.png)

colorcorrection2は元のカラーが暗くなるような調整にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548340/2595f67c-b037-d7fa-a221-c36ea6d811e8.png)


レンダリング結果です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548340/0687a95e-24a5-e351-9f6b-b310599ab18a.png)

colormix2の名前をrock_diffuse_detailに変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548340/b64de5af-6c21-bf63-f1fb-6b080347a2ee.png)


## ラフネスの設定

**base_colorかtint_color**を複製します。
名前をroughness_rampにします。

**unifiednoise_static5
multiply2**
を複製します。

ノードをつなぎます。（だんだん複雑になってきました・・・）
unifiednoise_static6、multiply3、roughness_rampが新しいノードです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548340/8a858d73-b5d0-b510-fc1d-1908f33b37f6.png)
見てわかるようにラフネスはcurvature2の範囲を利用してマスキングしてます。

unifiednoise_static6のOffset値を適当に変えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548340/e3b7f152-a7f9-e543-41cf-a490d4ff74a8.png)

roughness_rampの設定です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548340/f401f40a-ac65-77e7-5c82-c7cf26dce9b0.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548340/de542d5a-cb1f-edc9-4f48-aa43f6a7f4fc.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548340/f64b57a9-6d72-e29a-134e-7a34a563e801.png)

レンダリング結果です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548340/9f755db7-f82a-4c2f-1298-1483c81d4367.png)

ここまでで岩のベースのマテリアルは完成です。
以降は岩に生えた苔の表現をしていきます。

## 苔の生成

### 苔のマスク

以下のノードを新しく作ります。
**Global Variables
Ramp Parameter
Vector to Float
Fit Range
Color Mix**

ネットワークを↓図のようにつなぎます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548340/41311107-acde-2f11-081f-48878da6ccbb.png)

global2は新しく作成せずに、global1を使いまわしても問題ないです。ネットワークの見やすさを考慮して作成しています。
vectofloat1でNのY値だけを取り出します。

fit1のパラメーターを変更します。Nの-1～1という値の範囲を0～1の範囲にリマップします。次につながっているランプパラメーターを使いやすくするためです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548340/e7ba4467-b4c0-169c-175a-012981bef4a9.png)

Ramp Parameterはmoss_rampという名前に変えます。
色は、1は白、0.65以下は黒になるように設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548340/f19f22ee-0ceb-fe62-f0a5-cb402a960439.png)

そうすることで、横や下を向いている面は黒色に、上を向いている面ほど白色になるようなマスクを作ることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548340/f20702d6-d793-e142-680b-1fad60d58c18.png)


Occlusion
Multiply
Fit Range

### 苔の色設定

以下のノードを作成します。

**Multiply
Ramp Parameter
Unified Noise-Static(2つ)**

ノードをつなぎます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548340/3657b4dd-4661-945a-1c36-97421440f89d.png)

unifiednoise_static7のパラメーター
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548340/dab8212e-9219-c92a-4531-b90be8a3dfce.png)

unifiednoise_static8のパラメーター
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548340/bbaaf9e4-ccce-2f3f-e88e-43183f8c69a7.png)

Ramp Parameterはmoss_colorという名前にします。
色は適当に苔っぽい色を選択します。
unifiednoise_static7とunifiednoise_static8をMultiplyしてる影響で0.5以下の範囲に色がのりやすいですので、0.5以下のところにグラデーションを集中させてます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548340/87d4823d-cfd3-70cd-b24b-212675fa56db.png)

レンダリング結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548340/4dd252ed-1dbb-2df3-03d7-58f82e9f776b.png)

### 苔のディスプレイスメント

以下のノードを作ります。

**Mix
Constant
Multiply
Unified Noise-Static**

ノードを↓図を参考につなぎます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548340/571505ce-f035-8c3d-5747-1edd259015ec.png)

unifiednoise_static9のパラメーター
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548340/f7117ec3-95d2-57cc-7b4b-1ec61f9de21e.png)

rock_shaderのdispに繋いだだけではディスプレイスメントは有効にならないので、
DisplacementのCustom Inputを有効にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548340/29f48e3f-ae2f-9b09-7ab7-85cdb30d95c8.png)

レンダリング結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548340/fd239381-9ae9-50d1-a57f-6646e8222bf0.png)
少し苔のディテールが入った感じに。
ディスプレイスメント具合はconst1の数値を変えればOKです。

マテリアル作成は以上です。お疲れ様でした。

# 全体のネットワーク
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548340/f501989d-c4a9-c0ee-3b45-ab51859fb5a7.png)

# おわりに
後半は岩に藻をつける作業ですが、応用すれば雪の表現などもできると思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548340/e3e1353a-0562-5656-1040-fe741932aca0.png)

個人的にマテリアルをノードでがっつり組んだことなかったのでやってよかったです。
各種ランプのカラーやノイズの周波数などは適宜調整することでよりよい質感になるのではないかと思います。
特に周波数なんかは、オブジェクトの大きさによって変えたほうがいいかもしれません。
ノイズの種類もいろいろ試してみるとおもしろそうです。