UVの働きを検証する

シェーダー

3Dモデルには「3次元形状に対し、2次元テクスチャをどのように貼り付けるか」を定義する

「UV」という情報があります。

 

3次元形状の展開図を配置し、

「モデルのどの部分に、テクスチャのどのピクセルが当たるのか」を指定するのです。

Unity シェーダー UV

 

画のリアリティを向上させるため、

1つのマテリアルに対し複数のテクスチャを重ね合わせて複雑度を上げる、

と言う事をよくやるのですが、単一のUVでは表現できない事もあるため、

1つのモデルに対して複数のUVを用意して使用しています。

 

UnityにおけるUVの扱われ方は、第1UVがテクスチャ用で第2UVがライトマップ用、

と言うのが通例ですが、その他のUVがどうなるのかについては情報が無いので、

改めて検証してみようと思います。(Unity 2017.3.0p2)

 

 UVは幾つまでUnityに持っていけるのか

まず、1つの3Dモデルに対して幾つまでUVを保持できるのかを確かめます。

こんなモデルとシーンを用意しました。

Unity シェーダー UV

 

ただの平面をディレクショナルライトで照らしているだけ。です。

何かを検証する時は、「ちょっと面白そうなコンテンツ」にするより、

「可能な限りシンプル」にした方が、読者にとっても分かりやすいと私は思うのです。

 

平面モデルには以下のUVを設定しています。

Unity シェーダー UV

UV1を使用した場合はテクスチャの左上、UV2は右上、UV3は左下、UV4は右下、UV5は中央、

が表示されるはずです。

 

使用するテクスチャはこちらです。

Unity シェーダー UV

 

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);

}

 

インスペクターのテクスチャスロットに用意したテクスチャを当てます。

Unity シェーダー UV

 

結果、グラデーションテクスチャの左上部分が平面全体に表示されます。

これはモデルに設定したUV1の位置とも合致しています。

Unity シェーダー UV

 

同様にUV2~UV4も想定通りになりましたが、

UV5は全体がピンクになりました。

Unity シェーダー UV
Unity シェーダー UV
Unity シェーダー UV
Unity シェーダー UV

 

これはシェーダーが正常に働いていない事を示しているので、

Unityで使用できるUVは1~4の4つと言う事が分かりました。

 

 

 ライトマップを焼いた場合UV2はどうなるのか

ライトマップを焼いていない場合はUV1~4までを自由に使用できますが、

焼いた場合はUV2がライトマップ用となり使用できなくなります。

どういう事か実際にやってみます。こんなシーンを用意しました。

Unity シェーダー UV

先ほどの平面モデルに加え、

Boxモデル、ライトマップベイクに使用するエリアライトを配置しています。

平面モデルにはUV2の設定でテクスチャを貼り付けています。

 

Lighing の「Mixed Lighing」を On にし、Generateします。

Unity シェーダー UV

 

結果がこちらです。赤で囲った部分が平面、緑で囲った部分がBoxにあたります。

Unity シェーダー UV

ここで疑問が発生します。

UV2はライトマップに利用されているはずなのに、平面のテクスチャ表示がベイク前と同様です。

しかし、プレイボタンを押して実行すると・・・

Unity シェーダー UV

テクスチャ表示が変わりました。これはライトマップのUV位置ともぴたりと合致します。

実行開始時にUV2がアトラス化されたライトマップ用の位置に変更されるのです。

 

よって、ライトマップを焼いた場合、自由に使用できるUVは1・3・4の3つう事になります。

 

 リアルタイムGIを使用した場合はどうなるのか

ライトマップでUV2が使用不可になるのであれば、

リアルタイムGIではどうなるのでしょうか? こちらも実際にやってみます。

Unity シェーダー UV

先ほどのシーンのエリアライトをポイントライトに変更し、Mode を「Realtime」にします。

Unity シェーダー UV

 

Lighing の「Realtime Lighing」を On にし、Generateします。

Unity シェーダー UV

 

シェーダーの使用UVを変更して確かめたところ、UV3で想定外な状態になりました。

左がプレイ前、右がプレイ開始後です。

Unity シェーダー UV

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を自由に使用できる。

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)