normal map 1

ノーマルマップの作成 (1)

ポリゴン平面にディスプレイスメントマテリアルをアサインし、それをノーマルマップとしてレンダリングする方法を紹介する。

注意: ワークフローはそれほど複雑ではないが、細かい設定を正しく行わないと期待通りの結果にならない (ある意味落とし穴の多いゲームみたい)。ここではそういった「落とし穴」にはまらない様に留意する。反対に必須でないものは極力排除している。

使用バージョン: Houdini FX 14.0.310
シーンファイルへのリンクは一番下にあり。

I. 元形状の作成

元になる形状 (Grid ポリゴン平面) に UV を設定する。

  1. Create シェルフから Grid を生成
      grid_object1 ができる。
  2. grid_object1 をダブルクリックするなり i キーを押すなりして中に入る。
      grid1 があるのを確認。
  3. grid1 の出力から UV Project を接続。ディスプレイフラグ(水色) を設定する。
      uvproject1 ができる。
  4. uvproject1 の Group Type を Vertices にする。残りの設定はデフォルトのまま。
      しないと後ほどレンダリングした時に真っ黒になる。


注意: UV Project の Group Type は必ず Vertices であることを確認して次に進む。

II. ディスプレイスメントマテリアルの作成

法線情報の元となるマテリアルを簡単に作成。

  1. Material Palette へ行き、左側のマテリアルリストから Mantra Surface ノードを右側の /shop エリアにドラッグ&ドロップする。
      mantrasurface ができる。
  2. /shop エリアの mantrasurface をビューポート内の grid_object1 上にドラッグ&ドロップする。
      これでマテリアルがオブジェクトにアサインされる。 確認するには、/obj/grid_object1 の Material タブをみる。
      Material が /shop/mantrasurface となっているはず。
  3. /shop で mantrasurface を選択。
      ダブルクリックして中を見てはいけない。みるとあまりの複雑さに後悔する。何故なら、タブの数を見てわかるとおり、このシェーダは様々なプロパティを併せ持つ複合シェーダだから。今回は中には行かない。
  4. Displacement タブに行き、Noise-Based Displacement をオンにし、オンにすることによって有効になったTrue Displacement を必ずオフにする。
      しないと後ほどレンダリングした時に側面から見たような結果になる。
  5. Render view パネルに行き、Render ボタンを押してとりあえず一度レンダリングしてみる。
      このようなレンダリング結果を得るはず。これをノーマルマップとして使う。


注意: True Displacement は必ずオフにしたことを確認して次に進む。

III. ノーマルマップ出力ノードの作成

ノーマルマップの出力には Mantra ノードを使う。先ほどレンダリングしたことにより自動的に、/out 以下に mantra_ipr ノードが作成されたが、これとは別に作った方があとあと楽。いくつでも作れる。

  1. /out 以下に Mantra ノードを作成。Render->Create Render Node->Mantra とするか、TAB -> Render -> Mantra などとする。
      mantra1 ができる。
  2. Override Camera Resolution をオンにし、Resolution Scale を User Specified Resolution に、Resolution にテクスチャ解像度を設定する (例 512x512など)。
      これでレンダリング解像度が決まる。
  3. Images タブ以下 Extra Image Planes タブに行き、Extra Image Planes の数を 0 から 1 に、追加されたイメージプレーンの VEX Variable を export_normals にする。
      この設定で法線情報がパスとして書き出される。

  4. Rendering タブに行き、Rendering Engine を Micropolygon Rendering にする (必須)。
      しないとノーマルマップがレンダリングされない。
  5. 同 Rendering タブ以下の Render タブの UV Render Object を Operator Chooser を開いて、/obj/grid_object1 に設定。
      こうすることで uv attribute も uv と設定されるはず。

  6. Render View で Output Driver を mantra1 に設定、レンダリングを実行。
      最初に表示されるのは カラー (C) チャネル。

  7. Render ボタン真下の太いところをクリックすると View Bar が表示される。C から先ほど定義した export_normals に変更。
      ノーマルマップが表示されているのがわかるはず。

注意: ノーマルマップの生成には Micropolygon Rendering を使用する。Ray Tracing、PBR などは使用できない。RenderView で確認をする場合、Preview はオフにする。Preview がオンだと Render Engine の設定に関わらず Ray Tracing レンダリングが実行される。

IV. ファイルの書き出し

Render View から簡単にノーマル情報だけを書き出すにはこちらの方法を取る。

まとめ

  1. テクスチャ UV の設定は Vertices (面単位頂点) で行う。Points (共有頂点)ではうまく行かない。
  2. 法線情報は export_normals VEX Variable (パス) を使って書き出す。
  3. カメラからではなく UV 空間にレンダリングするには UV Render Object にオブジェクトを指定する。
  4. ノーマルマップ生成の Rendering Engine は Micropolygon Rendering 。

注意点まとめ

  • mantra: Unable to find UV object '/obj/grid_object1'
    というエラーが出る、またはレンダリング画像が真っ黒。
    • UV Project の Group Type を確認。必ず Vertices であること。
  • レンダリング結果の向きがおかしい。
    • Noise-Based Displacement を使った場合、True Displacement は必ずオフ。
  • Rendering Engine の設定が Micropolygon Rendering にもかかわらず、
    mantra: UV rendering unsupported with ray tracing.
    というエラーが出る。
    • Render View を使用している場合、Preview の設定を確認。オンの場合、オフにする。
    • Preview がオンだと Render Engine の設定に関わらず Ray Tracing レンダリングが実行される。

シーンファイル:

生成したイメージの出力 (ここに追記)、高解像度ジオメトリから低解像度ジオメトリへの転写などはまた次回 (こちら)。

3 件のコメント:

  1. はじめまして、いつも参考にさせていただいています。
    一点、質問させてください。

    こちらに記載されている内容を、H15.5で試してみたところ、
    「Ⅲ.ノーマルマップ出力ノードの作成」の項目の
    「5.」の画像にあるような「UV Render Object」と「UV Attribute」の入力欄がなく、行き詰まってしまいました…

    別のところで指定する必要があるでしょうか?

    初歩的な質問で恐縮ですが、ご教示いただけますと幸いです。
    よろしくお願い致します。

    返信削除
    返信
    1. こんにちは。申し訳ないですがこのページは Houdini 14.0 の頃に書かれたものですが、Houdini 15.0 でこの部分に大幅な改良が加えられ、Houdini15.0以降では、ここで記述された情報は役に立たないかもしれません。

      最新の方法を理解するのであれば、
      http://sidefx.jp/index.php?option=com_content&view=article&id=201
      を見ていただくのが良いかと思います。お手数をおかけいたしますが、宜しくお願いいたします。

      削除
    2. kenさん ご返答ありがとうございます!

      動画の方も、最新版(15.5.565)とはプロパティの内容が違っているようで、
      色々触ってみたものの、思ったようにいかず…だったのですが、、
      もう少し「BakeTexture」のサンプルファイルなど見て、勉強してみます…!

      削除