マテリアルで三角形のモザイクを作ろう【初心者向け】

この記事は[Unreal Engine (UE) Advent Calendar 2023(シリーズ 3)の4日目の記事](https://qiita.com/advent-calendar/2023/ue)です。

バージョン：Unreal Engine 5.3.2

## マテリアルでのモザイク表現について

UEのマテリアルでは、次のようにTexCoordとFloor(もしくはCeil)を使ってUVに手を加えることで、テクスチャなどから簡単にモザイク表現を作成することができます。

![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478649/380c9f49-f56d-f6bb-8df3-5624e3e58f4c.png)

ピクセルアートみたいでかわいいですね。

こちらの詳細な仕組み等については今回は省略します。
興味がある方はぜひ、『[HoudiniとUnreal Engine 4で学ぶリアルタイムVFX](https://www.borndigital.co.jp/book/16566/)』(著 池田 亘 さん) の p.102～ をご覧ください。
## モザイク用UVの中身を見てみる

さてこのモザイク用のUVですが、UとVに分けてみるとそれぞれ水平と垂直の方向に徐々に明るくなっていく段階的なグラデーションであることが分かります。

![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478649/0e06b191-e95d-d107-8db8-ac44f0fa74de.png)


**このグラデーションの向きを斜めにすれば四角形じゃないモザイクが作れるのでは？**

というのが今回の内容です。

## グラデーションの向きを斜めにする
早速作ってみましょう。

TexCoordから得られる水平方向のグラデーションと垂直方向のグラデーションはそれぞれ、
**左端から右端への0.0~1.0のグラデーション**と
**上端から下端への0.0~1.0のグラデーション**になっており
これらを足し合わせて平均を取ることで、
**左上端から右下端への0.0~1.0のグラデーション**が作成できます。

![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478649/187c4b67-f392-39e0-bc94-3c5690457cc7.png)
この状態では斜め45度のグラデーションにしかなりませんが、

![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478649/ddd72869-ac81-2a9c-de1e-b0b56c6f49cb.png)
このように水平方向と垂直方向の足し合わせる割合を変えることで、左上端から右下端への変化量は0.0~1.0のまま角度を変化させることができます。

またTexCoordから得られるグラデーションは0.0~1.0のため、
![05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478649/c0aadb82-0178-c913-0999-16e093a86d31.png)

OneMinusを使ってグラデーションの向きを反転させると最終結果の上下や左右の反転も簡単に変更できます。

## 水平方向のグラデーションにする

こうしてできた二種類のグラデーションをブレンドすると、斜めに区切られつつ右に向かって水平方向に明るくなっていく段階的なグラデーションができます。

![06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478649/8bf7d68f-70f2-f5af-7c44-f7fff40ea143.png)


## 三角形のモザイク
ここまでの内容を踏まえ、次のようにノードを組みます。

![07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478649/ef3a6949-4a6e-f2bd-4a67-9e1c4bf6635f.png)

<img width="400" alt="160944.png" src= "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478649/efd271f3-3544-006d-6469-a33178933112.gif">

### カッコイイ！
三角形のモザイクを作ることができました。


<img width="400" alt="09.png" src= "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478649/59877299-25a1-b740-94da-3812656e1ff2.png">

分割数のパラメーターを変更しても崩れないことを確認しましょう。


## 応用例

今回作成したマテリアルは普段UVを使用する部分へ置き換えるだけで様々な表現へ応用が可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478649/1c9918fc-ab59-8eac-b9b6-3285c22d0b7f.png)
例として、汎用的なノイズテクスチャに使用すればランダム性のある模様に変換でき、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478649/832d1bc0-d70e-190a-fd6b-1094a3b55a3e.png)
テクスチャのタイリングも可能です。
この際三角形の大きさは変化しません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478649/1ac89109-6975-a241-2877-02a709e05318.png)
ここからいい感じにマスクを生成すれば・・・

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478649/2c00cc3d-e637-a146-a438-28e261ba027b.png)
境界にパーティクルのようなディティールを追加したゲージなどが作成できます。

<img width="400" alt="09.png" src= "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478649/885e6025-70db-cafb-fa3a-9372cc8d540c.png">　
さらにポストプロセスマテリアルでSceneTextureのUVにマスクとして使用すれば・・・

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478649/e69f86f7-4dc2-1d4f-e543-a8643cb7bb78.png)
このようにSFチックなバイザーを通した視界のような表現も可能です。
ぜひ面白い使い方を探してみてください。

## おわりに

今回作成した三角形は正三角形のように見えますが、
正確には底辺と高さが1:1で等しい二等辺三角形であり、正三角形ではありません。

今回の方法はベクトルの計算などに慣れていない方でも仕組みがイメージしやすく作りやすい反面、

**・** 正三角形にはならない（途中の値に複雑な小数を設定する必要がある）
**・** 分割数によって元のテクスチャと比べて左右にズレが生じる

といった欠点があります。

今回紹介した方法のほかにも、三角関数やベクトルの計算を使った全く異なるアプローチで三角形のモザイクを作り出すことが可能です。
方法次第では上記の欠点も意外と簡単に解決できたりするのでぜひ挑戦してみてください。

## 余談

難易度や処理の複雑さはぐっと上がりますが、
正六角形のモザイクもそれほど多くないノード数で作ることができます。
<img width="345" alt="11.png" src= "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478649/239ff0c0-71ad-0a12-265d-ab4c116922a4.png">　<img width="315" alt="12.png" src= "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478649/c7a0b55b-ca43-59e5-abda-1e298c52b4cf.png">
こちらも先ほどの例のように様々な表現に応用が可能です。
自信のある方はぜひこちらにも挑戦してみてください。