[UE4]自分のマテリアル組術

- 本記事に関して
  - 確認バージョン: UE4.23/24
  - C++/エンジン拡張: 無し

普段やっていること、気にしている事を適当にメモしました。
大体において自分の思うままに組んでいますので、ぼくはそうじゃないとかあるかもしれません。
他の人の考えも見てみたいです。記事、誰か、書いてくれる嬉しい


# Usage/ユセージ（使用方法）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58518/32fd4d8e-e3d5-3089-f3f2-755bae880cd0.png)
→[マテリアルのプロパティ - Unreal Engine Document](https://docs.unrealengine.com/ja/Engine/Rendering/Materials/MaterialProperties/index.html)
「Automatically Set Usage in Editor」をOFFにして、必要なものにだけチェックを入れます。
「Automatically Set Usage in Editor」がONですと、エディター上でその種類が使われた時に自動的にチェックが入ります。


Cascadeでマテリアルを設定すると、「Used with particle Sprites」が自動的にONに
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58518/1afe2a92-50be-daba-d4f4-68a6194b7ac0.png)


知らないウチにチェックが追加されてメモリが増えるのも問題ですが、
担当者がチェックが増えたマテリアルのアセットをコミット忘れる時あるのが困ります。
※メモリが増える参考→[マテリアルとマテリアルインスタンスの仕組みと問題点の共有 (Epic Games Japan: 篠山範明)](https://www.slideshare.net/EpicGamesJapan/epic-games-japan-ue4dd/72)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58518/6048ae85-95b5-4afd-651b-036e80cd3c2d.png)
→Submit→パッケージ化
![2019-12-22_21h35_06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58518/9c3ff5d7-5eed-e40d-896b-fd65165521f7.png)
というバグチケットが飛びます。
「Automatically Set Usage in Editor」がOFFだと、使用時に見た目がデフォルトマテリアルのままになりますので、「あれ変わらない？」とそこで気付きます。（ハズです）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58518/c8c84bdc-33a6-cc8c-6223-d8d7d5c87d83.png)


# 関数化
マテリアルは繋げばすぐ結果を確認でき、しかも変数が使えない為どんどんノードを延ばして構築されデカくなる事が多々あります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58518/ff537d64-c79f-d4ec-e3d2-bb70c2d170b4.png)
ですので一回機能を確認出来た段階で、機能ごとに関数化します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58518/aeca1c02-95fc-7a6d-e43c-02cc72da961e.png)
一箇所でしか使わないマテリアル関数アセットが大量に出来ます。仕方ないです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58518/7d66a424-5f16-6a27-3077-f62e43d192fc.png)
トップでは細かい処理は把握する必要なくて、何の機能を繋いでいるのかが分かれば良いかな、と。
（仕様変更で後から機能を消す、付け足すとかありますしね……）

後から機能単位（関数単位）で最適化する際にもこの単位で行えるのでやりやすいです。


# コメントを忘れない
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58518/ff537d64-c79f-d4ec-e3d2-bb70c2d170b4.png)
書いて、お願い。

コメント周りの必要性はBPとあまり変わらないと思います。
コメントは下記があります

- **グラフコメント**
    - ![2019-12-22_22h43_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58518/57fd7c9e-63b6-4e68-6550-03390b363215.png)
    - 大まかに、この辺りは何の処理してるかをメモします
- **マテリアル関数の詳細欄「MaterialExpression」-「Description」**
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58518/7f52b105-a259-58d5-3626-d78ef42feb6a.png)
    - この関数の処理内容を書きます
    - コンテンツブラウザを列表示にすると、一覧出来るようになります
        - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58518/15633051-c5aa-9f4b-5c51-5e732d3d05cd.png)
- **マテリアル関数のInput/Outputノードの詳細欄「Material Expression Function Input/Output」-「Description」**
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58518/178c39f3-32a2-60a1-6bb6-7eecf4fd4af2.png)
    - そのマテリアル関数を使用する箇所で、マウスオーバーでツールチップが出ます
        - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58518/c3509343-5a10-e288-498a-36cf3d92565e.png)
- **各パラメーターノードの詳細欄「MaterialExpression」-「Desc」**
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58518/431c683b-9fa8-954b-a66b-184fdb1a7f1a.png)
    - マテリアルインスタンスの該当パラメーターをマウスオーバーでツールチップが出ます
        - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58518/2df415fc-9926-b55a-11bf-48964830140d.png)
    - 実装した人と、インスタンスを調整する人が違う場合は特にキッチリ書く必要ある思います


# 計算が続く箇所には何やったかを細かく書く
読めば分かりますが、パッと見で何やったのか、期待する結果が分かりません。
ノードの数が多くなると一つ一つ読んでいくのも大変なので細かく書いています。
![2019-12-22_23h06_54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58518/79b21a9e-b939-f6f1-b844-49dd8d37c813.png)
![2019-12-22_23h09_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58518/48e12679-1d4e-53c6-dbde-c8035d2a8cca.png)
（手元に良い例がなかったのででっち上げ）一個一個頭の中で考えるの疲れるので計算多い所はこんな感じにしています。



# 種類によってコメントのカラーを分ける
マテリアルが大きくなってくると、このノードの流れはBaseColorだっけ、Emissiveだっけ……
とノードを追う事が有ります。

なのでコメントのカラーで視認出来るようにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58518/bd91a1e7-1e3b-10da-063b-072c8cf60788.png)
（手元に良い例なかったのででっち上げ）Rerouteノードにもカラー付きでコメントを付けて分かりやすくしています

# ScalarパラメーターのSlider範囲を設定する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58518/c7e16b92-3fb8-5e5f-579b-3469e89724da.png)
Scalarパラメーターは詳細欄でSlider範囲が設定できます
このSlider範囲はマテリアルインスタンスで調整する際の弄りやすさになってくるのでキッチリ設定します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58518/2dc83cd2-f6dd-420f-569f-0929280dccb6.png)
設定しないと数字が大きく伸びていきますので、細かく値設定したい時難しくなります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58518/f4ffffc3-a722-b4d4-b95f-abc399e8422c.png)
また、調整する人に「大体この辺の数値取る」という意図にもなります。

# Customノードにマテリアル関数名書く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58518/d7ae46b7-04be-0023-bf43-e13177beb110.png)
Customコードの頭に使用しているマテリアル関数名をコメントで仕込んでおきます。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58518/74a209ca-5474-5041-d0ae-d219be50629e.png)
Customノード、必要に駆られてちょくちょく使っています。
で、偶に計算不具合を起こしたり、一部環境で使えない構文使ってたりでエラー調べる事があります。

マテリアルのHLSLコード書き出しやRenderDoc等のシェーダーデバッガーで調べるのですが、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58518/c5bdadea-dbb7-5b3e-ea9f-5fc947884753.png)
ここzerodivしてるっぽい
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58518/a095b9cb-7239-048f-3f36-72d71aca000f.png)
で、このCustomコードってどこで実装してる……？
全マテリアルからCustomコード内を検索するUE4機能は……？
となる事がちょいちょいありました。

前述のようにコメントで仕込んでおくと、HLSLコード書き出しで確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58518/55784a95-3e1f-9147-1f44-3e04c17423bc.png)



# 参考資料
- マテリアルとマテリアルインスタンスの仕組みと問題点の共有 (Epic Games Japan: 篠山範明)
    - https://www.slideshare.net/EpicGamesJapan/epic-games-japan-ue4dd
- 大規模タイトルにおけるエフェクトマテリアル運用 (SQEX大阪: 林武尊様)
    - https://www.slideshare.net/EpicGamesJapan/sqex-ue4dd
- マジシャンズデッド ポストモーテム ~マテリアル編~ (株式会社Byking: 鈴木孝司様、成相真治様)
    - https://www.slideshare.net/EpicGamesJapan/byking-ue4dd
- [UE4]マテリアルの注意すべきこと！～テクスチャロードとSwitch～
    - https://www.slideshare.net/com044/ue4switch