2016-01-08

packed primitives


Packed Primitives はデータを効率的に使いまわし・保存する方法で、低メモリ、低ディスク容量で、大規模なデータを扱うことを可能にする。ここでは、Packed Primitives の使用法のおさらいをする。



使用したビルド: Houdini 15.0.346
参考シーンファイルへのリンクは一番下にあり。

おおまかな流れ

  1. ポイントクラウド生成
  2. ジオメトリのアサイン
  3. ジオメトリの出力
  4. レンダリング
  5. IFD

1. ポイントクラウド生成

高品質のポイントクラウドを作ることが主眼ではないので、簡単にポイントクラウドを作る。

  1. Create シェルフで Sphere を実行。ネットワークビューで、作成された sphere_object1 の中に入り、sphere1 の Radius の値を 2, 2, 2 にする。
  2. sphere1 の出力から TAB-> Volume -> IsoOffset を実行。isooffset1 が出来る。変更不要。
  3. isooffset1 の出力から TAB-> Particle -> Scatter を実行。

    scatter1 が出来、ポイントの集合体がビューポートに現れる。これをポイントクラウドとして使用する。

    左からポリゴン (sphere)、ボリューム (isooffset)、ポイントクラウド (scatter)。
次に進む前に、シーンをファイルに保存 (例: packedToys.hip)。$HIP を決定しておくと良い。後ほど出力するキャッシュファイル名、その出力先を容易に把握できるようにする。また、8GB 以下の RAM の場合、scatter1 の Force Total Count を 500 以下にした方が良い。

2. ジオメトリのアサイン

ポイントクラウドにジオメトリをアサインする。これは同じネットワーク内で行う。

  1. TAB -> Test Geometry -> Test Geometry: Rubber Toy を実行。testgeometry_rubbertoy1 が作成される。
  2. 作成されたジオメトリはこのままでは大きすぎるので、testgeometry_rubbertoy1 の出力から TAB -> Manipulate -> Transform を実行。transform1 が作成される。Uniform Scale の値を 0.05 ~ 0.1 ぐらいに変更。
  3. TAB -> Utility -> Copy を実行。copy1 が作成される。
  4. copy1 の左側の入力に transform1 を、右側に scatter1 を接続。

    メモリが少ない場合、表示フラグを copy1 移す前に、Stamp タブ以下の3つをオンにする。
    • Stamp Inputs
    • Cache Stamping Geometry
    • Pack Geometry Before Copying
    Pack Geometry Before Copying をオフにしなかった場合、copy1 ノードの持つ ポイント量は 1,200万 を超え、このノードのメモリ使用量は 2.3GB になるが、ジオメトリを Packed Primitive として扱うことで、 copy1 のポイント量は、1,000 (ポイントクラウドのポイント総数)、メモリ量は 1MB 以下になる。

    Packed Primitive にしたことによる最大の見た目の違いは、ジオメトリがマテリアルを失うこと。これは後ほど対応する。

3. ジオメトリの出力

ジオメトリをアサインしたポイントクラウドをファイルに出力する。これも同じネットワーク内で行う。

  1. copy1 の出力から TAB -> Managers -> ROP Output Driver を実行。rop_geometry1 が作成される。
  2. 一番上にある Save To Disk ボタンをクリックして、一枚だけファイルを出力 (Valid Frame Range が Render Current Frame)。
    ここまでの設定の場合、816KB のジオメトリキャッシュファイル (packedToys.rop_geometry1.1.bgeo.sc) が出力される。ちなみに、Packed Primitives を使わなかった場合、キャッシュファイルの大きさは 657MB (824倍)。

4. レンダリング

  1. 一つ上(/obj) に戻り、sphere_object1 を geometry などと名称変更。
  2. TAB -> Geometry -> Geometry として Geometry ノードを作成。geo1 が出来る。こちらを render などと名称変更。
  3. geometry の表示フラグをオフにして非表示にする。
  4. render の中に入り、ここにある File ノード (file1) の Geomtry File に先ほど出力したキャッシュファイル (packedToys.rop_geometry1.1.bgeo.sc) を指定、あわせて Load を "Packed Disk Primitive" とする。
    • Display Type を Point Cloud にするとポイントだけで表示される。
  5. ビューポートでカメラの位置を決め、 Lights and Cameras シェルフの Camera ツールを Ctrl キーを押しながらクリック。/obj に cam1 が作成される。
  6. Houdini UI 上部の メニューから Render -> Create Render Node -> Mantra - PBR を実行。/out に mantra1 が作成される。
  7. Render to MPlay をクリックしてレンダリングを実行すると、ビューポートの表示が Point Cloud であっても、ジオメトリが正しくレンダリングされる。ただし、先ほど同様、マテリアルが付いてこない。
  8. /obj/render 内に戻り、file1 の出力から TAB-> Material -> Material を実行。material1 ノードが出来る。

    このノード内の Material フィールド右端の Operator Chooserを使って Test Geometry 以下のマテリアル (ToyShader) を指定。
  9. 再びレンダリングすれば今度はマテリアルがついてくる。

5. IFD

IFD は、フレーム単位でのシーンの状況を記述し、レンダラーに渡すためのファイルフォーマット。

  • こちらの方法 (Driver タブ以下の Disk File をオンにし、Render to Disk をクリック) を元に IFD ファイルを出力すると、出力された IFD ファイルの大きさは 180KB。一瞬で出力される。
  • ここまで説明してきた Packed Primitives を用いずに素のままで 1000回コピーしたジオメトリを IFD として出力すると、ファイルの大きさは 1.4GB (7605倍)。
  • もっとも、Packed Primitives を使用した場合、IFD ファイルだけではレンダリング出来ないので、IFD (180KB) とジオメトリキャッシュ (816KB) を合計すれば 996KB。これでも 1,374倍のデータ削減につながる。ファイル出力時間もレンダリング時間も短いし、メモリに読み込むのも楽。

まとめ


最終更新: 2024-04-05

0 件のコメント:

コメントを投稿