Help us understand the problem. What is going on with this article?

すごい!!Unityって鍋の裏もレンダリングできるんだね!!【HDRP: 異方性反射マップ】

この記事は【unityプロ技】 Advent Calendar 2019の12/3の記事です。
【unityプロ技】 Advent Calendar 2019

鍋の裏とは、異方性反射とは

anisotropy.png

たかが鍋の裏、されど鍋の裏。従来のUnityでは難しかった異方性反射表現がHigh-Definition Render Pipeline(HDRP)で可能になりました。異方性反射とは、ライティングの反射光を上下左右に細長く変形させるテクニックで、アニソトロピー(Anisotropy)と呼ばれます。分かりやすい例を挙げると、鍋の裏やCDといった筋の入った金属表現です。上のサンプルだと、質感が全然ちがいますよね?

プリレンダリングのCGソフトでは割とメジャーなライティング表現でした。しかしながら、Unity向けのテクスチャの作成方法がいまいち文章化されていなかったので、この記事を書きます。
 

AnisotropyMapはただのマスクマップ

Unityのアニソトロピーマップは、レッド(R)成分を採用するマスクマップでしかありません。変化させたい部分をRで描き、マスクしたい部分は黒で塗りつぶします。ちょうどこのようなマップを描いたとすると、
anisotropy_maskmap.jpg
ライティングはこんな感じになります。
anisotropy_scale.gif
インスペクター内のスライダーで調整するスケールは、引き延ばす方向に左右します。-1でV方向、1でU方向に作用します。ワールドやローカルにおけるxyz軸には関係がありません。メッシュのUV座標を基準とします。
anisotropy_inspector.jpg

TangentMapで反射方向をコントロールする

異方性反射ライティングを行う上でもう一つ大切なマップがあります。それがタンジェントマップです。これはメッシュの接線方向を定義するために使用します。

モデルを形成するポリゴンの法線は各々一つしか持ちえませんが、ポリゴンの接線は必ず一つとは限りません。普段意識することがないのは、値を設定しないかぎり、テクスチャ座標上のU方向を接線ベクトルとして扱っているからです。タンジェントマップでは、その接線ベクトルを設定することができます。

では、なぜわざわざ接線ベクトルを定義する必要があるのでしょうか? それはU方向に偏りがあると、反射光を引き延ばす方向にも偏りが出るためです。簡単な例として、さきほどのメッシュを回転させてみます。その様子がこちら。
anisotropy_gif2.gif
反射光が引き延ばされる角度と引き延ばされない角度があることがわかります。サンプルはアニソトロピースケールを-1でライティングしています。(スケールが-1、つまりV方向に引き延ばしているということです。)

なぜ、反射光が全く変化しない角度が存在するのでしょうか? アニソトロピーライティングの簡単な図解を見てみます。

リアルタイムレンダリングでは、メッシュへの入射角に対してその反射角方向に映るキューブマップをライティングに加算します。キューブマップとは、上下左右前後ろの6枚をあらかじめレンダリングしておき、疑似的な反射光として利用するテクスチャの一種です。Unityではリフレクションプルーブという名前で使われます。

Unityの異方性反射では、この反射角度を回転させることで、キューブマップをずらし、あたかも反射が歪んでいるかのようにライティングしているわけです。正確にはキューブマップを動かしているのではなく、本来取るべきキューブマップのテクスチャ座標をずらしている、ということです。以下の図説は座標軸もわかりやすく傾けていますが、法線や従法線が実際に傾いているわけではありません。
anisotropy_lighting.gif

先ほどのサンプルでは、タンジェントマップを設定せずにアニソトロピースケールを-1に設定しました。つまりV方向にずらしています。上の図説のように従法線が上向いた状態となります。ですので、従法線方向が奥行になる視点からメッシュをレンダリングすると、反射光が歪んで見えます。一方で、接線方向が奥行になる視点からでは、まったく歪みが現れません。接線が上向いているわけではないからです。逆に、アニソトロピースケールを1に設定すると、接線が上向いた状態となり、反射光がU方向にずれたライティングになります。

以上のことをまとめると、タンジェントマップの役割は、反射角度のヨーを担っているといえます。そして、インスペクターのスケール調整スライダーはロールとピッチを担っているということになります。

また、ノーマルマップとは違って、異方性反射は法線を動かしません。つまり、どの角度から見ても凹んでいるようには見せずに反射光を曲げたライティングができる、ということがノーマルマップとの最大の違いになります。

axis.jpg

 

タンジェントマップの作り方

タンジェントマップではベクトルのxがレッド(R)成分、yがグリーン(G)成分に相当します。ベクトルを書き込むツールはペイントソフトには搭載されていないので、法線軸の回転(オイラー角)を白黒のグラデーションで書き込み、のちにベクトルに変換します。

ここでは黒を回転角度0、白を回転角度360として扱っており、グラデーションマップで色変換を行っています。グラデーションマップはgithubにて配布しますので、ご自由にお使いください(ダウンロードはこちら)。グラデーションのかけ方やグラデーションマップの適用方法は割愛します。
gradationmap.jpg

何個かテクスチャを作ってみてわかったことですが、円形に循環するようにタンジェントを組んであげる方がルックを強力にできます。円形にすることで、必ずビュー方向に向くタンジェントが存在するようになり、反射光の拡散が常にライティングされるためです。以下のサンプルだと、左よりも右のタンジェントマップのほうが異方性拡散を視認しやすくなります。
tangentsample.jpg tangentsample2.jpg

アニソトロピーマップの使用例

アニソトロピーマップというよりタンジェントマップの活用例といった方が正しいかもしれません。できるだけ効果を視認しやすいマテリアルを選びました。

パールメッキ

2048x1152_114.jpg

亜鉛メッキ

2048x1152_115.jpg

ウロコスピン

2048x1152_116.jpg

円形紋様

2048x1152_117.jpg

トライアングル

2048x1152_118.jpg

アニソトロピーマップを使う上での注意点

  • スムーズネスを1に設定した場合、アニソトロピーマップが無視されて完全反射になります。アニソトロピーマップを使用する際は、スムーズネスを0.99以下に設定してください。
  • スケールはマイナス方向に動かした方が、ルックがそれっぽくなります。経験則からすると、スムーズネスを0.7、アニソトロピースケールを-0.3にすると、一番映える気がします。
  • 複雑なアルベドマップを作らない方が色味の変化を視認しやすくなります。色を塗る場合は単色で塗るほうが良いです。

まとめ

Unityの異方性反射ライティングは、アニソトロピーマップが難しいのではなく、タンジェントマップがややこしいです。ノーマルマップに比べると、効果が地味な部分もありますが、異方性反射にしかできない質感があります。HDRPでプロジェクトを進めるなら、一度触ってみてください。

おまけ

サンプルをアセットストアに出品しました。アニソトロピー表現を詰め込んだマテリアル集となっております。手早くアニソトロピーを体験したい方は、どうぞお買い求めください。

Anisotropy Material Pack

また、上のアセットをストアに出品した手順を記事にし、同日別のアドベントカレンダーで公開しました。アセットストア出品に興味のある方はご覧になってください。

参考文献

https://learn.foundry.com/modo/901/content/help/pages/shading_lighting/shader_items/anisotropic_direction.html
https://help.sketchfab.com/hc/en-us/articles/360020687812-Anisotropy

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした