UE4はテクスチャをインポートする際、
ある程度自動で適切な圧縮形式にしてくれます。
例えば、ノーマルマップなんかはその最たる例で、
UE4が「あ、こいつノーマルマップだ」と判断すると、
BC5などのノーマルマップに適した圧縮形式に自動設定されます。
(むしろ勝手に設定が変わってて「??」となった方もいらっしゃるかもしれません。)
このノーマルマップの判定は、
NormalMapIdentification.cpp内の、
**DoesTextureLookLikelyToBeANormalMap()**という関数で行われています。
中身の実装を見てみると、
なるほど、ピクセルの色からベクトルを出して、
長さがおかしかったり、向きが逆向いてたりするものを判定しているのですね。
そしてノーマルマップなら大体{0,0,1}の方向を向いているはずと考えて、
誤差の範囲内であればノーマルマップと見なすと、そういうことみたいです。
##ノーマルマップ判定をすり抜けよう
とはいえ実は、上の判定、
テクスチャの全ピクセルに対して行っているわけではありません。
判定を高速化するため、テクスチャを縦横16分割して限られたピクセルだけ判定を行っています。
へえ、なるほど。
であるならば……。
こういう、判定されるピクセルだけ塗りつぶしたグリッドを用意すれば……
なるほど、ノーマルだと判定されていますね!
……
……
……
であるならば……。
どんな画像でも上のグリッドを重ねてやれば……、
本来ノーマルではないおかずさんをノーマルと判定させることが可能ですね!
##高周波ノイズには気をつけよう
上のノーマルおかずさんはあくまでジョークですが、
ノーマル判定が大体{0,0,1}の方向を向いているはずという前提で判定されている事は気に留めておいても良いかもしれません。
例えば、以下のテクスチャは一見ノーマルマップに見えますが、
UE4はこのテクスチャをノーマルマップと判定しません。
なぜかというと、アップにするとわかるのですが、
以下のようなピクセルレベルの高周波ノイズが入っていると、
平均値が{0,0,1}の方向から大きくズレてしまう為です。
UE4のノーマルマップ判定はあくまで簡易的なものです。
自動で判定されていること、判定自体が厳密ではないことを気をつけて、
正しいテクスチャ圧縮形式を設定して頂けましたら幸いです。
圧縮形式のチェックにはプロパティマトリクスが便利ですね。
おしまい。