MMEでのノーマルマップ
MMEを利用した材質の拡張の一種です。
ノーマルマップ(法線マップ)というのは法線の向きを画像マップに従って指定することで、材質表面に奥行きがあるかのように印影を描画する、凹凸感を出すとかそういうものだそうです。やってみるとわかるんですが、光源に対する反応とかが単純なテクスチャとは違います。
- ノーマルマップ自体は出ないですが、シェーダについて色々参考になるのでギブソンさんの講座はひととおり見るといいです
使用するMMEファイル
Furiaさんの配布ページ
http://flammpfeil.appspot.com/trinketbox/
にある
- advancedTextureMapping2.zip
及び
- ToonMaster0.3.8+2.zip
を使います。
ToonMasterの方は狭車ひろむさんのToonMasterを視差マップ対応したもので、理由があって私が頼んで作っていただいたものです。
GIMPでノーマルマップを作成
適当なグレースケール画像を作成。黒が低くて白が高い。
ノーマルマッププラグインを使います。解説はこちらが詳しい。
GIMP の Normalmap プラグインを試す - WebOS Goodies
■ノーマルマッププラグインのダウンロード場所
http://registry.gimp.org/node/69
プラグインの動作
ノーマルマッププラグイン。左が"3D Preview"。
いじっているのは
- Fillter
…画像からの変換方式。プレビューを見ながらこれを変更してしっくりくるのを選ぶ。
- Scale
…彫りの深さ
- 3D PreviweのObject type
…Teapotがわかりやすい。また左の電球を選択すると光源を動かせる。
プレビューで確認したら、"Inver X", "Inver Y"にチェックを入れます。
プレビューだと彫りが逆転しますが、MMDでは軸が逆になるのこうします。OpenGLとDirectXの違いとかですかね?
ザックリと効果解説
ノーマルマップ適用。法線が変化しているのでスペキュラとシェードが載ってますね。
スペキュラ反射がないと、トゥーンシェードの2段階階調ということもあり起伏にとぼしいです。スペキュラありでも、陰になっている部分はそうですね。
MMD標準のmetal.sphを適用したもの。
環境マップも影響を受けるので、これを併用するとかなり起伏が出ます。
また、full+NormMap.fxではデフォルトはテクスチャフィルターがオフになっているため、表面テクスチャを使う場合は下記のように書き換えるとテクスチャ処理がキレイになります。(その分処理は重くなります)
//テクスチャフィルタ一括設定////////////////////////////////////////////////////////////////////
//異方向性フィルタ(なめらか表示&遠くても綺麗 ※TEXFILTER_MAXANISOTROPYも設定しましょう)
#define TEXFILTER_SETTING ANISOTROPIC
//バイリニア(なめらか表示:標準)
//#define TEXFILTER_SETTING LINEAR
//ニアレストネイバー(くっきり表示:テクスチャのドットが綺麗に出る)
//#define TEXFILTER_SETTING POINT
//異方向性フィルタを使うときの倍率
//1:Off or 2の倍数で指定(大きいほどなめらか効果・負荷大)
//対応しているかどうかは、ハードウェア次第(RadeonHD機種なら16までは対応しているはず
#define TEXFILTER_MAXANISOTROPY 16
視差マップの作り方
GIMPだと、advancedTextureMappin2の視差マップ用のマップ画像はある問題があってうまく作れないことがあるので、ToonMaster0.3+2.fxを使います。
視差マップとは、ノーマルマップにさらに高さ情報を加えてより奥行きのある陰影表現を可能にしたものです。
この場合は、最初に作ったグレースケールをハイトマップにするだけでオーケー。
ハイトマップについては、最初に作ったグレースケールの白黒を逆転すればオーケー。白いところが低くて黒いところが高くなります。ん、というか最初からそういうふうに作ればノーマルマップも逆転しなくてすんだような…。
ToonMasterの視差マップも、このあたりのint Miplevelsを16とかにすると精度は上がります。テクスチャフィルタ設定も各所にあるような?
//視差マップ用テクスチャ/////////////////////////////////////////////////////////
//視差マップの凹み具合
#define HeightFactor 0.008f
texture NormalTex1 <
string ResourceName = "Parallax0.png";
int Miplevels = 16;
>;
sampler NormalTexSampler1 = sampler_state {
texture =;
MINFILTER = ANISOTROPIC;
MAGFILTER = ANISOTROPIC;
MIPFILTER = LINEAR;
AddressU = WRAP;
AddressV = WRAP;
MAXANISOTROPY = 16;
};
texture HeightTex1 <
string ResourceName = "HeightMap1.png";
int Miplevels = 16;
>;
sampler HeightTexSampler1 = sampler_state {
texture =;
MINFILTER = ANISOTROPIC;
MAGFILTER = ANISOTROPIC;
MIPFILTER = LINEAR;
AddressU = WRAP;
AddressV = WRAP;
MAXANISOTROPY = 16;
};
また、陰の処理がtoon.bmpの2階調なのが不満だったので、パラメータをいじることでシェードをグラデーション上などの処理ができるようになっています。このためにToonMasterとの統合をお願いしました。まだ実験中ですが…。
// パラメータ
#define SensitiveShadow false // カメラ追従影強度制御フラグ
#define ToonFactor 1.5f // トゥーンの境界処理(大きいほどシャープ)
#define ToonThreshold1 0.01f // 影閾値
#define ToonThreshold2 0.5f // ハイライト閾値
#define ToonThreshold3 0.20f // 影閾値(カメラ追従光源)
#define ToonThreshold4 0.90f // ハイライト閾値(カメラ追従光源)
#define CameraFactor1 0.80f // カメラ係数(影)
#define Color1 1.2f // 影色調整
#define Color2 1.50f // ハイライト色調整
元になるマップがなくてもこういう一枚画像からでもFiltter等を試してみればかなりそれっぽいものが作れます。
視差マップを作るなら、ハイトマップはものにもよりますがグレースケールで階調反転とかしてトーンカーブでコントラスト上げたりとか。
あと、環境系のテクスチャではこのソフトを使うと自動でシームレステクスチャをハイトマップまで作成できたります。かなりオススメ。リアル系で情報量多いので多少の加工をすればオケー。
窓の杜 - 【REVIEW】約千種類もの素材を同梱したテクスチャー画像生成ソフト「Genetica Viewer」