[UE4]Anisotropy(異方性反射)の使い方とそのTangentについて

![Aniso_2_comp.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1006571/5c04631f-061f-26f7-145d-9089d3c8c57e.gif)
Unreal Engine 4.26から正式にマテリアルにAnisotropyが追加され、簡単に異方性反射を表現できるようになりました。
本記事では、そのAnisotropyについて、特にTangentの入力について紹介します。

公式ドキュメントでは、[こちら](https://docs.unrealengine.com/ja/RenderingAndGraphics/Materials/MaterialInputs/index.html)にAnisotropyについての記載があります。

# 使い方と各インプットについて
4.26からは、デフォルトでマテリアルのインプットに**Anisotropy**と**Tangent**が追加されています。
こちらに値やテクスチャを入力することで使用することができます。
ちなみに4.25の時点では、まだベータなので、「プロジェクトの設定」で「Use anisotropic BRDF (Beta) (異方性 BRDF を使用)」にチェックを入れる必要があります。
<img width="40%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1006571/3ee34f86-144a-7f54-0a3d-a41699f3e5c4.png">

## ◆ Anisotropy Input
こちらは、[-1 ~ 1]の範囲でスカラー値を入力することができます。
・0では、等方性反射で変化はしません。
・正の値では、Tanget(接線方向)に沿ったハイライトになります。
・負の値では、Binormal方向に沿います。(Tangent, Binormalについては後述します。)
下記の画像は、UVのU方向にTangentが向いているときの例です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1006571/216be0f4-d22e-9db6-d474-811ba17a7202.png)

## ◆Tangent Input
まず、こちらのインプットが**何のTangentのことを指しているか**というと、**サーフェスの頂点の法線ベクトルからサーフェイスに沿って、90度の角度にあるTangent(接線)ベクトルのことを指します。**
Binormal(従法線)は、Tanegntに垂直なベクトルになります。
ちなみにこれはTangent Spaceでの話になります。

UE4内でもStaic MeshのツールバーからNormal、Tangent、Binormalを確認することができます。
緑がNormal、赤がTangent、青がBinormalの方向を示してます。
<img width="85%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1006571/fa14e2e1-f599-afd0-cb76-84d115bfa2b2.png">

### ◇Tangent Inputに入力がない場合
マテリアルのTangent inputに入力がない場合は、サーフェスの頂点のTangent(法線方向)を使用します。
そのため、各頂点のTangentが意図した方向に向いている(向かせている)場合は、Tangent inputに入力がなくても使用することができます。

Tangentは、基本的に頂点座標、法線、UVの値を元に計算されますが、メッシュのインポート時に**「Normal Import Method」**でTangentをそのままインポートするか、UE4側で再計算するかを指定することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1006571/86810733-d9bb-e3cb-883f-bef51350d426.png)

しかし、意図した方向にTangentが向いていない(向かせるのが難しい)場合がほとんどです。
そこで、**Tangent InputにTangent(とBinormal)の向きを入力することで反射の方向を制御することができます。**

### ◇Tangent Inputに入力する値とテクスチャ
では、Tangent Inputにはどのような値を入れれば良いでしょうか。
ここでは、以下の3つの方法を紹介します。

- RGBのAnisotropy Angle Mapを使う
- グレースケールのAngle Mapを使う
- UE4内で計算する

#### ▼ RGBのAnisotropy Angle Map
下記の画像のような
R:Tangent, G: Binormal, B:Normalの方向を格納したテクスチャを使用する方法です。
方向のみを使用するため、ベクトルの大きさは必要ありません。
また、基本的にはTangent Spaceで計算したマップを使用します。
下記、例の画像は、[Textures.com](https://www.textures.com/download/PBR0028/133064)からお借りした画像ですが、Tangent Inputにそのまま繋ぐだけで使用することができます。
![aniso_1-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1006571/46391445-8ebb-d89d-74f3-121c2d3b8a23.jpeg)

Binormalは、NormalとTangentが決まれば、それらの外積で求まりますが、アーティストがこのマップを簡単に作成できるソフトはなかなかないため、簡単な方法としては次のグレースケールのAngle Mapを使うやり方です。

#### ▼グレースケールのAngle Map
![T_Angle2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1006571/2105096e-6bf4-cf6e-37c6-002914e2b2b3.jpeg)

２つ目の方法としては、上記のようなマップを使う方法です。
こちらはSubstance PainterなどでもAngle Mapとして作成することができます。
Substance PainterのサンプルシーンのPreview Sphereでも使用されています。
![sp2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1006571/5eb28519-f808-2850-4fd7-4e19a738b8ce.jpeg)

このマップは以下のようにノードを組むことで使用することができます。
![angle.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1006571/40d9f325-cca4-6fa8-56c4-48f6fb3c50d5.jpeg)

注意点として、UE4.26時点では、32bitのマップでないと以下のようなアーチファクトが発生してしまうので、注意してください。
また、なるべく大きな解像度のテクスチャを使用した方が、滑らかなハイライトが得られます。
![artifact.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1006571/9caea6fd-05b8-b700-1128-f66f29cda78c.jpeg)

#### ▼UE4内で計算する
TangentとBinormal方向をテクスチャを使わずに計算するのも一つの手です。
以下の画像は記事冒頭のgif画像のような円方向のTangentを計算した例です。
UV から (0.5, 0.5) を引くと中心が (0,0) になり、すべての点が中心から外側を指すベクトルになります。
![Radial.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1006571/54a9a298-df3e-cc60-dea6-ad2428232775.jpeg)

この方法もTexCoordを使用しているので、UVベースなことに気を付けてください。
この方法を用いる場合は、カラーテクスチャなどを使用するためのUVとは別に、Anisotropyを使用したい面のノーマル方向からプロジェクションしたUVを作成しておくと良いかもしれません。


 
# Anisotoropyの対応状況と注意点(UE4.26時点)
4.26では、以下のライトや反射に対応しています。

- Spot Light
- Directional Light
- Point Light
- Sky Light
- Reflection Capture
- Ray Tracing Reflection

Rect Lightなど上記以外のライトは対応しておらず、等方性反射になります。

また、マテリアルエディタで「Tangent Space Normal」のチェックを外すと、ノーマルの入力がWorld Spaceになりますが、**Tangentの入力もWorld Spaceに**なってしまうのでお気を付けください。

---
異方性反射を使用する機会はそこまで多くはないと思いますが、知っておくと表現の幅が広がるので、ぜひお試しください！