UVの働きを検証する
シェーダー
3Dモデルには「3次元形状に対し、2次元テクスチャをどのように貼り付けるか」を定義する
「UV」という情報があります。
3次元形状の展開図を配置し、
「モデルのどの部分に、テクスチャのどのピクセルが当たるのか」を指定するのです。
画のリアリティを向上させるため、
1つのマテリアルに対し複数のテクスチャを重ね合わせて複雑度を上げる、
と言う事をよくやるのですが、単一のUVでは表現できない事もあるため、
1つのモデルに対して複数のUVを用意して使用しています。
UnityにおけるUVの扱われ方は、第1UVがテクスチャ用で第2UVがライトマップ用、
と言うのが通例ですが、その他のUVがどうなるのかについては情報が無いので、
改めて検証してみようと思います。(Unity 2017.3.0p2)
UVは幾つまでUnityに持っていけるのか
まず、1つの3Dモデルに対して幾つまでUVを保持できるのかを確かめます。
こんなモデルとシーンを用意しました。
ただの平面をディレクショナルライトで照らしているだけ。です。
何かを検証する時は、「ちょっと面白そうなコンテンツ」にするより、
「可能な限りシンプル」にした方が、読者にとっても分かりやすいと私は思うのです。
平面モデルには以下のUVを設定しています。
UV1を使用した場合はテクスチャの左上、UV2は右上、UV3は左下、UV4は右下、UV5は中央、
が表示されるはずです。
使用するテクスチャはこちらです。
UV検証用のシェーダーを用意しました。
登録したテクスチャが表示されるだけの、ごくシンプルなものです。
struct Input {
float2 uv_MainTex;
}
void surf (Input IN. inout SurfaceOutoputStandard o) {
o.Albedo = tex2D(_MainTex, IN.uv_MainTex);
}
赤ハイライトの部分で「UV1を使用しなさい」と指定しています。
他のUVを使用したい場合は番号を追記します。
struct Input {
float2 uv2_MainTex;
}
void surf (Input IN. inout SurfaceOutoputStandard o) {
o.Albedo = tex2D(_MainTex, IN.uv2_MainTex);
}
インスペクターのテクスチャスロットに用意したテクスチャを当てます。
結果、グラデーションテクスチャの左上部分が平面全体に表示されます。
これはモデルに設定したUV1の位置とも合致しています。
同様にUV2~UV4も想定通りになりましたが、
UV5は全体がピンクになりました。
これはシェーダーが正常に働いていない事を示しているので、
Unityで使用できるUVは1~4の4つと言う事が分かりました。
ライトマップを焼いた場合UV2はどうなるのか
ライトマップを焼いていない場合はUV1~4までを自由に使用できますが、
焼いた場合はUV2がライトマップ用となり使用できなくなります。
どういう事か実際にやってみます。こんなシーンを用意しました。
先ほどの平面モデルに加え、
Boxモデル、ライトマップベイクに使用するエリアライトを配置しています。
平面モデルにはUV2の設定でテクスチャを貼り付けています。
Lighing の「Mixed Lighing」を On にし、Generateします。
結果がこちらです。赤で囲った部分が平面、緑で囲った部分がBoxにあたります。
ここで疑問が発生します。
UV2はライトマップに利用されているはずなのに、平面のテクスチャ表示がベイク前と同様です。
しかし、プレイボタンを押して実行すると・・・
テクスチャ表示が変わりました。これはライトマップのUV位置ともぴたりと合致します。
実行開始時にUV2がアトラス化されたライトマップ用の位置に変更されるのです。
よって、ライトマップを焼いた場合、自由に使用できるUVは1・3・4の3つと言う事になります。
リアルタイムGIを使用した場合はどうなるのか
ライトマップでUV2が使用不可になるのであれば、
リアルタイムGIではどうなるのでしょうか? こちらも実際にやってみます。
先ほどのシーンのエリアライトをポイントライトに変更し、Mode を「Realtime」にします。
Lighing の「Realtime Lighing」を On にし、Generateします。
シェーダーの使用UVを変更して確かめたところ、UV3で想定外な状態になりました。
左がプレイ前、右がプレイ開始後です。
UVが左右反転して、時計回りに90度回って、位置と大きさが変更されている・・・
よく分かりませんが、UV3がリアルタイムGIに利用されると言う事でしょう。きっと。
よって、リアルタイムGI使用時、自由に使用できるUVは1・2・4の3つと言う事になります。
まとめ
検証の結果、以下のことがはっきりしました。
① ライトマップ・リアルタイムGI不使用時は、1・2・3・4のUVを自由に使用できる。
② ライトマップ使用時は、1・3・4のUVを自由に使用できる。
③ リアルタイムGI使用時は、1・2・4のUVを自由に使用できる。
④ ライトマップ・リアルタイムGI使用時は、1・4のUVを自由に使用できる。
[…] UV の働きを検証する | Tsumiki Tech Times […]