LoginSignup
15
3

More than 3 years have passed since last update.

[UE4]テクスチャインポート時のノーマルマップ判定をすり抜けろ

Last updated at Posted at 2019-12-23

UE4はテクスチャをインポートする際、
ある程度自動で適切な圧縮形式にしてくれます。

例えば、ノーマルマップなんかはその最たる例で、
UE4が「あ、こいつノーマルマップだ」と判断すると、
BC5などのノーマルマップに適した圧縮形式に自動設定されます。
(むしろ勝手に設定が変わってて「??」となった方もいらっしゃるかもしれません。)
image.png

このノーマルマップの判定は、
NormalMapIdentification.cpp内の、
DoesTextureLookLikelyToBeANormalMap()という関数で行われています。

中身の実装を見てみると、
image.png
なるほど、ピクセルの色からベクトルを出して、
長さがおかしかったり、向きが逆向いてたりするものを判定しているのですね。
image.png
そしてノーマルマップなら大体{0,0,1}の方向を向いているはずと考えて、
誤差の範囲内であればノーマルマップと見なすと、そういうことみたいです。

ノーマルマップ判定をすり抜けよう

とはいえ実は、上の判定、
テクスチャの全ピクセルに対して行っているわけではありません。

判定を高速化するため、テクスチャを縦横16分割して限られたピクセルだけ判定を行っています。

へえ、なるほど。
であるならば……。

こういう、判定されるピクセルだけ塗りつぶしたグリッドを用意すれば……
image.png
normal.gif
なるほど、ノーマルだと判定されていますね!

……
……
……
であるならば……。
どんな画像でも上のグリッドを重ねてやれば……、

image.png
normal2.gif
image.png
本来ノーマルではないおかずさんをノーマルと判定させることが可能ですね!

高周波ノイズには気をつけよう

上のノーマルおかずさんはあくまでジョークですが、
ノーマル判定が大体{0,0,1}の方向を向いているはずという前提で判定されている事は気に留めておいても良いかもしれません。

例えば、以下のテクスチャは一見ノーマルマップに見えますが、
UE4はこのテクスチャをノーマルマップと判定しません。
image.png
なぜかというと、アップにするとわかるのですが、
以下のようなピクセルレベルの高周波ノイズが入っていると、
平均値が{0,0,1}の方向から大きくズレてしまう為です。
image.png
UE4のノーマルマップ判定はあくまで簡易的なものです。
自動で判定されていること、判定自体が厳密ではないことを気をつけて、
正しいテクスチャ圧縮形式を設定して頂けましたら幸いです。
image.png
圧縮形式のチェックにはプロパティマトリクスが便利ですね。

おしまい。

15
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
3