2008-12-02

〜1000HIT記念記事〜

カウンター設置して1ヶ月経っていないのに1000件もアクセスいただき感謝感謝です。

せっかくなので記念にすごい情報を書こうと心に決めていたのですがまったく実装が追いつきませんでした。先ほどみたらすでに1409HIT。しまったーーーー!

ってなわけで以前から言っていた「とある計画」の全貌をご覧下さい。


バンプマップ実装を試みているときにこの無駄な計画が思い浮かびました。
バンプマップとはテクスチャ以外にもう一枚の面に対する法線(面がどこむいてるのか?って線)のデータを持たせてやり、処理の軽いでこぼこを表現するもの。といった概念で説明されることが多いです。

もっと詳細に言うと5種類くらいあるのですが同じ種類でもサンプルには二種類あることに気づきます。
・光の位置と目線の位置から光の計算を変えているかどうか?という点です。
法線にワールド座標すら適用させずにいるのでテクスチャに影を書いて貼り付けた状態と変わらないものもあります。

そもそも光の位置というものを一方方向のベクトルとして捉えた描写でバンプマップを行ったとしても、簡単な影製造機程度の効果しか得られないことが多いでしょう。

ここでシェーダを一から書いた人なら誰でも気づくことを復習してみます。
・光を意識しないレタリングをするとほとんど奥行きがなく目線を動かさないと何があるかも分からない常態になる。
・光を演出するには法線光ベクトル目線が必要。

はい、ここでまた考えます。物体を表現している重要ファクターは法線なんです。
その法線情報を好きなように変えているのになぜバンプマップがあまり強力に感じないのか?
とっても気になりますね。

そこで答えは「光が動かないから」ではないのだろうか?と考えたのです。
正確には「光のベクトルが位置によって変わらない」から。
突き詰めれば「点光源じゃないから」。

そこで点光源+バンプマップを実装するためにあーだこうだしてきたのです。
数日前からの記事がそれです。

ようやくできました。
結果
「うん!これはすごい!多分使える」

しかしながら結局バンプマップじゃん!法線マップ作るの大変だしGimpとかフォトショで後で作るんでしょ?って思いますよね。ノンノンノン!
強い見方がいるのです。

いつもの彼です。
Blender君の出番です。
な、なんと!
「ハイポリとローポリの差を埋めた法線マップを書いてくれる」
んです。

はっきり言ってやばい機能です。
10万ポリで書いたものを500ポリで表現とかできます。
ただしバンプマップなので「輪郭」だけはローポリのようになります。
あと、凹凸により後ろの面が隠れるというのもハイポリ側の点ではなくなります。
しかしながらかなりのディティールが作りこめます。

以下が実装した絵です。ただの立方体4つ、
点は16個。軽いとかそういう問題じゃないです。
しかし
ハイポリ側は1万くらいの点を使っています。この数に制限はないし軽さも変わらないです。
bumpSP1.jpg
ポイントである光の位置を変えます
bumpSP2.jpg
光源を下方向にかなり離します
bumpSP3.jpg

ゲーム製作をしている方なら頂点16個でこの表現は魅力だと思います。


では早速そのBlenderの機能について説明します。
レンダーベイクという機能です。

Blenderは操作が独特なので、モデリングは自分の好きなものでローポリとハイポリを作り、ベイク機能のためにBlenderを使用する。といった使い方がよいかと思われます。(挫折しないで済むから)

私の場合はメタセコなのでまずメタセコデータを読み込ませます。
インポータはぐぐった方が早いので割愛。MQO系のプラグインを作っている親切な方がいらっしゃいます。
日本語化はしないほうがいいです。色々問題が出ていたのが英語のまま使うと全部消えました。
メタセコを読み込むときの画像ファイルの設定する場所では画像自体ではなく画像が存在するフォルダを指定しなければならない。混乱しやすいので注意です。

とりあえずテクスチャの設定方法の流れを書きます。(飛ばしてOKです)
・窓を二分割
・3DView画面とUV操作画面にする
・3DView画面をオブジェクトモードにしてオブジェクトを選択(→クリック)
・TABを押してエディットモードにする
・Aを押して全体選択
・UV画面に移動して△▽ボタンをおして画像を選択
・ユーザーインターフェイスがリセットされるのが嫌な場合は(二分割とかしたのが戻っちゃう等)Ctrl+Uで保存できる


これで一応テクスチャ割り当てを見れます。
ではここに法線データを書き込んで見ましょう。

〜その前に注意点〜
・ハイポリとローポリは比較計算させるので二つとも用意しなければならない。
・テクスチャを法線MAPで上書きされたくないときはNewからサイズを選んで任意のテクスチャを割り当てる。
・UV展開を綺麗にしておかなければならないのはローポリだけ。ハイポリの方はテクスチャすらいらない。
・ローポリを作るときハイポリをすっぽり覆うように!とかはみ出ないように!などの考慮は一切いらない。ただし比較を計算するので出来るだけ差がでないように二つのオブジェクトを重ねて置く。
・重なって片方だけ手を加えたくなって邪魔なときは消したいほうを選んでHを押すと一時的に消える。Alt+Hで戻る。
・BakeパネルはF10をを押してRenderカテゴリの横のAnimタブの横(裏?)にあるbakeタグを選択するとでてくる。


〜実際の手順〜
・2つのオブジェクトをロードする。
・ローポリにテクスチャを割り当てる(ImageのNewで新規に作る場合お好みで32bitを選択することも出来る)。
・大まかに重なるように二つのオブジェクトを配置する(この時の差がNormalMapになる)。
・ハイポリを選択。
・Shiftを押しながらローポリを選択(薄いピンクになる 選びにくいときはAlt+右クリしてから任意の文字の上でShift+左クリ)。
・この時ハイポリ側は複数オブジェクトでもOK。
サーフェイスモデファイアなどもかかったままで適用できるのでエフェクトガンガンかけたものをハイポリ側として利用可能(ApplyしないでOKということ)。
F10を押してBakeパネルの設定 Normalを押す Selected to ActiveをOn NormalのスペースはTangent。
・Bakeを押すと焼きこみ終了。

変な部分がでてきたらBias値を変えてみる この値は差の許容値を示す。
imageのsave as(Alt+S)でイメージを保存する。
保存したファイルをXNAで使う場合はノーマルMAPのUV方向に注意。
GimpでのプラグインはX軸反転にチェックをいれた状態と一致するはず?。
自分のバンプの仕様を揃えたほうがなにかと便利っぽい。


NormalMap作成時、座標空間を考慮できる。
Camera Space: カメラ基点
World space: ワールド(グローバル)座標系内の Normal で、オブジェクトの Transform と変形に依存。
Object space: オブジェクト(グローバル)座標系内の Normal で、オブジェクトの Transform には依存しませんが、変形には依存
Tangent space: タンジェントスペース座標系内の Normal で、オブジェクトの Transform と変形に依存しない




ふぅ〜ひと段落。



さて次にどうせならハイポリが楽に作れたら?なんて思いますよね。
点の数がどうでもいい〜ってなるなら以前紹介したスカルプトモデリングなんてやり放題。
それ以外にも素敵な機能があったので載せておきます。

〜テクスチャブラシ〜
・F6をおしてBrushを選ぶ。
・作成したブラシを選んでTypeをNoneからImageにする。
・一番右のLoadを押して適用したいテクスチャをロード。
・スカルプトモードでF9を押してTextureタブを探す。
・空白のボタンを押して作成したブラシを選ぶ。
・Sizeを弄って書いてみよう。


これはスカルプトのときに任意の絵がブラシになります。
例えば以前猫ペイントの記事で載せた絵をブラシにして一回なぞると
blender1.jpg
こんな感じになります。
苦労せずハイポリの模様が書き込めるなんて魅力ですね。
いろいろ遊んでみてください。


これにて記念記事の内容はおしまいです。

長くなりましたが、、
このブログが何かのヒントになることを祈りながらこれからも記事を書こうと思います。
末永くよろしくお願いします。





ねよっと。

comment

管理者にだけメッセージを送る

プロフィール

Author:asha
ぷぃぷぃXNA

カテゴリ
最新記事
検索フォーム
最新コメント
リンク
このブログをリンクに追加する
ブロとも申請フォーム

この人とブロともになる

カウンター