夏までにiPhone アプリつくってみっか!

趣味でiPhone/Androidアプリを開発し、日々勉強した事を書いています。オープンワールド系レースゲームをUnityで開発中です。

【Unity】テクスチャのインポート設定で色々な見た目の問題を解決

今回はUnityのテクスチャインポート設定がモデルの表示品質にどのように影響するか検証してみました。
なお、テスクチャのインポート設定は、プロジェクトパネルでテクスチャを選ぶとインスペクタに表示されまます。

その1
前回、ノーマルマッピングを施したナンバープレートがUnity上で見るとグニャグニャなのが気になったのでまずはこれを修正したいと思います。

tf.hateblo.jp

ご覧のとおり、クラッシュして潰れたナンバープレートを叩いて直したような悲惨な感じになっています。

f:id:takujidev:20151023193816p:plain

これを新車同様にするためには、テクスチャの取り込み設定でCompressedになっているのをTruecolorに変更します。
その結果、このように綺麗な平面が得られました。
なお、文字のフチがギザギザなのはテクスチャの解像度が足りないせいなのでこれでは改善されません。
Truecolorは、テクスチャの圧縮を使わない設定なのでメモリ使用量が増加します。圧縮フォーマットのPVRTC 4bitsから非圧縮のRGB24 bitになるとこのテクスチャのメモリの使用量は6倍になります。

f:id:takujidev:20151023194447p:plain

表示品質を取るかメモリを節約するか悩ましいところです。
将来的にメモリ使用量が厳しくなったら圧縮に戻す可能性ありです。

その2
次にテクスチャの色漏れの問題を解決したいと思います。
白いバックランプをよく見ると分かりますが、上の方が赤色ににじんでいます。

f:id:takujidev:20151023195315p:plain

これはAlbedo用テクスチャを圧縮をしない設定にするか、Mip Mapの生成を解除すると治りました。
なお、Mip Mapの設定は標準ではインスペクタに表示されず、Texture TypeをAdvanceに設定することで表示されるようになります。
デフォールトではGenerate Mip Mapsのチェックボックスがチェックされていますので、チェックを外します。
すると、このようににじみがなく綺麗に表示されます。

f:id:takujidev:20151023195852p:plain

Mip Mapは何段階かに縮小したテクスチャをあらかじめ用意しておくことでテクスチャを縮小するときの品質やパフォーマンスが向上する技術らしいですが、今回は逆に色がにじんで品質が低下結果となりました。
Mip Mapを使わない場合は小さいテクスチャが生成されなくなるのでその分若干のメモリの節約になります。
テクスチャの非圧縮よりは悪影響が少なそうなので、今回はMip Mapの設定を変えました。

その3
最後にスペキュラーマッピングの不具合です。

非常に見えにくいですが、黄色の丸をつけた部分に艶感が違う四角い部分があります。

f:id:takujidev:20151023201107j:plain

このボツボツはいたるところにあって、太陽が反射するとボディが全体的にザラついた質感に見えます。
これはスペキュラーマップ用テクスチャの圧縮によるノイズによるもので、インポートでTrueColor設定にすると消えました。

f:id:takujidev:20151023202824p:plain

以上、3つの不具合をテクスチャのインポート設定で解決しました。
表示品質は良くなったのですが、メモリ使用量の増加やパフォーマンスの低下がゲームにどの程度影響するか現時点では不明なので、チューニングの過程で設定を戻す可能性はあります。

【Blender, Unity】ノーマルマッピングでちょっとした凹凸をつける

私がノーマルマッピングを初めて体験したのはXBOX360バイオショックというゲームでした。
壁のタイルがデコボコして縁がテカテカしているように見えるのを「これがノーマルマッピングかー」と感動しながら視点をグリグリ動かして遊んでいました。

さて、そんな感動的なノーマルマッピングを自分がモデリングした物体に施せる日が来るとはその時は思いもしませんでした。

これまでモデリングしてきたCR-Xですが、正直ノーマルマッピングを試せるような場所はほとんどありません。
と、いうことで今まで忘れていたナンバープレートを急遽取り付けてみました。

ついでに今までテクスチャで汚く反射を書き込んで誤魔化していたヘッドライトの具もモデリングし、完成したモデルがこちら。

f:id:takujidev:20151020220430j:plain

f:id:takujidev:20151020220443j:plain

肝心のナンバープレートは残念ながら解像度が足りなかったせいか少しいびつにデコボコしているように見えます。

今回は白黒で高さを表すハイトマップを手書きで作成し、それをUnityに取り込む時点でノーマルマップ化しています。

こちらがハイトマップ。
f:id:takujidev:20151020221058p:plain

白いほど高い所、黒いほど低い所です。ここではナンバープレートとホイールナットだけ白くしています。

UnityのProjectパネルからハイトマップのファイルを選択し、Texture Type をNormal mapにし、Create from Grayscaleにチェックを入れればUnityが内部的に青紫色のノーマルマップとして扱ってくれます。

f:id:takujidev:20151020221328p:plain

あとはこれをStandard シェーダーのNormal Mapスロットにドラッグするとデコボコするはずです。
デコボコ具合は先ほどのテクスチャ取り込み設定画面のBumpinessかNormal Mapスロットのパラメーターで設定できますので、いい感じに設定してあげます。私はNormal Mapのパラメーターは1のままBumpinessを0.01にするといい具合になりました。 なお、Bumpinessの値を変更したあとはApplyボタンを押さないと反映されないので注意です。

拡大するとこんな感じです。

ノーマルマッピングなしの場合
f:id:takujidev:20151020223335j:plain

ノーマルマッピングありの場合
f:id:takujidev:20151020223351j:plain

あんまり綺麗じゃありませんでしたね。

Blenderの場合は新たにテクスチャスロットを作ってそこにグレースケールのハイトマップを開き、Influence設定のGeometry:Normalにチェックを入れ、こちらもパラメーターを変化させて丁度良い具合にします。
f:id:takujidev:20151020224135j:plain
Blenderレンダリングした場合はUnityよりは少し綺麗に見えます。
ただ、地面に反射したナンバープレートはおかしく表示されてしまいました。

さて、ライトのモデリングですが、こうなっています。

f:id:takujidev:20151020224716p:plain

前回の百式のくだりで書いた通り、UnityではスペキュラーマップのRGBチャネルの値によってMetallicパラメーターを設定できます。

tf.hateblo.jp


ライトの反射鏡のようなパーツは不透明の白(RGBアルファ全部最大値)にすれば綺麗な鏡面になります。
あとはライトのガラスを表現すれば完成ですが、透き通った材質を表現するにはマテリアルを分け、そのマテリアルのシェーダーのパラメーターを変える必要があります。
使うシェーダーは同じStandardシェーダーですが、Rendering ModeをTransparentにします。
あとはテクスチャーを設定してやればOKです。マテリアルが違っても同じテクスチャを共用することは可能です。

最後に、Smoothnessの値を調整して太陽の光が当たった時にいい感じに反射するようにしてみました。

f:id:takujidev:20151020230623j:plain

今回でCR-Xモデリングは完成となります。この1台作るのに1ヶ月以上かかったと思います。
もっとペースアップが必要ですね。

最終的にVerts 3749, Faces 3679, Tris 7198となりました。