読者です 読者をやめる 読者になる 読者になる

Skyrim箱庭DIY

MODによる固有の環境不具合は自分で直して快適ゲーム。CTDにさようなら。Do It Yourself!!

SkyrimにおけるUVマップについて



スポンサーリンク

Nifskopeの続きを書いてたのですが、「Texture Clamp Mode」だけで膨大になりそうだったので、UVマップだけ独立させることにしました。時間も無くてなかなか進みませぬ。

テクスチャを扱うにおいて「UVマップ(UV MAP)」という言葉をよく聞くと思います。これは単純に言うと「メッシュの展開図」です。展開図をペーパークラフトのように組み立てるとメッシュが完成するという話です。この展開図に合わせてテクスチャを作成することになります。

※微妙に言葉の定義とか間違いがあるかもしれません。Skyrim内での使い方としては、多分間違ってないとは思いますが・・変な所あったら指摘貰えるとありがたいです。

なんでUV MAPが必要なのか?

 UVマップというメッシュの展開図なんて物がなんで必要かというと、これが無いとテクスチャをうまく貼れないからです。Septimコインを例にします。

左がディフューズマップ、右がノーマルマップです。

Septimコインのテクスチャ

人の目で見る分には、どう貼ればいいか何となく見当つきますけど、PCは適当には動いてくれません。これを正しくメッシュに貼る為にはどうすればいいか?簡単確実なのは、メッシュの展開図に合わせてテクスチャが描いてあれば間違い無いですよね。

 

UVマップとメッシュの関係

Blenderで開いたSeptimコイン。左がUVマップにテクスチャを貼り付けた画像、右がメッシュにテクスチャを貼り付けた画像です。テクスチャを作りやすい形にメッシュの展開図が作られています。UVマップ情報はメッシュファイルに格納されています

SeptimコインのUVマップ

この場合は大きく分けて

  • 表面
  • 裏面
  • 側面

の3つに分かれた展開図になっています。形が単純なのでシンプルです。

 

UVマップとテクスチャ解像度の関係

テクスチャは解像度が決まってますが、UVマップそのものには解像度が決まっていません(頂点同士の位置を計算すれば好きにできる)。

平面のX軸をU方向、Y軸をV方向として、多くのUVマップは、

左上:X=0、Y=0(左上が原点になる。上の画像参照のこと)

右下:X=1、Y=1

としています。これはUVマップに対して1:1でテクスチャを合わせるということです。実際に使われるメッシュの大きさ次第でUVマップの大きさも変わり、それに合わせてテクスチャを引き伸ばしたり縮めたりするわけです。

ちょっとわかりづらいかもなので、わかりやすそう(?)な例を。

 

UVマップとテクスチャの関係をPCに例えてみる

PCのディスプレイ=UVマップ

PCの壁紙=テクスチャ

と例えます。

 

ディスプレイサイズ=壁紙サイズの場合

 ディスプレイ、壁紙共に1920x1080の場合です。寺生まれのTさんをモチーフにしてみました。1:1でディスプレイ(UVマップ)に壁紙(テクスチャ)を貼り付けました。特に不都合なさそうです。

寺生まれのTさん1

 

ディスプレイサイズ>壁紙サイズの場合

ディスプレイは同じですが、壁紙サイズは480x270と大幅に小さくなりました。1:1で貼り付けるということは、左上と右下をあわせることなので、「引き伸ばし」をすることになります。テクスチャ解像度が低すぎる場合に起こるやつですね。

寺生まれのTさん2

 

ディスプレイサイズ>壁紙サイズの場合その2

解像度は先ほどと同じなのですが、右下の座標がX=4、Y=4になっています。これはテクスチャに対してUVマップが4倍あるという設定になります。したがって引き伸ばされることなく、左上にだけ表示されています。

寺生まれのTさん3

 

余白の部分は、壁紙で「同じ画像を並べる」のと同じように、テクスチャを並べて貼る設定をしておくのが通常みたいです。MeshのBSLightingShaderPropertyにあるTexture Clamp Modeを「WRAP_S_WRAP_T」に設定することで、U方向V方向共に並べていきます。

寺生まれのTさん4

WRAP_S_WRAP_Tだとこんなイメージ。メッシュ設定の話になるので詳しくはNifskopeの記事でやります。

どうでもいいですがTさん描くのに時間かかった割には、ほとんど潰れてる画像ばっかりになってしまいました(笑)

 

UVマップの形を見ればわかりますが、体型や装備はもとより、上のコインですらこの設定だと表示がおかしくなるので、通常はX=1、Y=1で使います。(平面上でテクスチャを並べるだけなので、タイル状の物以外は化けると思います)

どうにもテクスチャ表示が怪しいと思ったときは、チェックしてみてください。あまり無いとは思いますが。

 

こんなところで終わります。