2020-01-07

64bit processing


ここでは、このマスタークラス (英語字幕付き)で紹介されている Houdini でのジオメトリの64ビット処理について日本語で補足説明する。



使用したビルド: Houdini 18.0.339 (Windows 10)
シーンファイルへのリンクは一番下にあり。

1. 32ビットでの問題点 その1 原点より遠いところでの処理

32 ビット処理で問題になるものの一つに原点から遠いところでの処理があげられる。以下は、問題を再現する方法。

  1. Houdini を起動、ビューポートで Rubber Toy を作成。
      /obj/ 以下に testgeometry_rubbertoy_object1 ノードができる。
  2. /obj/testgeometry_rubbertoy_object1 に入り、そこにある testgeometry_rubbertoy1 の出力に Transform ノードを追加。
      transform1 ができる。
  3. transform1 の Translate X, Y, Z にそれぞれ 10_000_000 と入力する。

      大きい値を入れる際には '_' で桁区切り入力が可能。ただし、エクスプレッションが有効になった状態となる。
  4. transform1 を複製する。
      Alt キーを押しながらドラッグすると複製ができる。
      もしくはコピペ。いずれにせよ tranform2 ができる。
  5. transform2 で Invert Transformation をオンにし、rubbertoy -> transform1 -> transform2 の順にノードが接続されるようにする。

      Invert Tranformation をオンにすると、設定されている値の逆算が行われる。
  6. transform2 で表示フラグをオンにするとビューポートの Rubber Toy は悲しい形状で表示される。
  7. Geometry Spreadsheet で Rubber Toy の P (頂点) アトリビュートを見ると、すべて 0 か -1 になっていることがわかる。
この問題の原因は、transform1 で設定した 10,000,000 という値が 32ビットで使うには大きすぎるから。次に解決方法を紹介する。

2. 問題その1 解決方法 Attribute Cast

  1. Attribute Cast (attribcast1) を作成。
    • testgeometry_rubbertoy1 と transform1 の間に挿入。
    • Attribute に P
    • Precision を 32-bit float から 64-bit float に変更。
    • これにより、ビューポートの Rubber Toy は正しく表示される。表示フラグは tranform2 のまま。
  2. transform2 で情報パネルを表示すれば、P アトリビュートが 3flt64 と表示され、このアトリビュートが64ビットで処理されていることがわかる。

    追加表示のないものは32ビット。
  3. Geometry Spreadsheet に戻れば、P[x], P[y], P[z] にそれぞれ64と小さな字で追記されていて、64ビットデータとして処理されていることが確認可能。

    こちらも追加表示のないもの、例えば N (法線) は32ビット。

3. 問題その2 Attribute Wrangle

  1. attribcast1 の出力から枝分かれさせ、Attribute Wrangle (attribwrangle1) を作成。
  2. VEXpression の項に
    @P += 10_000_000;
    と入力。ここでも '_' による桁区切りが可能。
  3. attrwrangle1 を先ほどと同じ要領で複製する (attribwrangle2) 。
  4. attrwrangle2 を attrwrangle1 の出力に接続する。
  5. VEXpression の項に
    @P -= 10_000_000;
    と入力。
  6. 表示フラグを attrwrangle2 に設定すると、Attribute Cast によって P が 64ビットになっているにも関わらず、 Rubber Toy がまた悲しい状態に戻る。

3. Attribute Wrangle 解決方法

その1: Bindings VEX Precision

  1. attrwrangle1 の Bindings タブ以下の一番下にある VEX Precision をデフォルト値の Auto から 64 Bit (Experimental) に変更。
  2. attrwrangle2 でも同様の変更を行う。すると、 Rubber Toy は正しく表示されるようになる。

その2: Attribute Cast Preferred Precision

  1. 「その1」で設定した attrwrangle1 と attrwrangle2 の VEX Precision をそれぞれ Auto に戻す。
  2. attribcast1 を選択、一番上の Set Preferred Precision を Unchanged (デフォルト) から 64-bit に変更する。
      これにより Attribute Wrangle での Auto が 64ビットとなり、ビューポートには Rubber Toy が正しく表示されるようになる。
  3. この際に、ネットワークエディタ上の関連するノードには虫のマークのバッジが追加される。

      ネットワークエディタ内で 'd' キーを押した際に表示されるオプションの Badges タブの一番下に 64-bit Geometry Badge が追加されたのが確認できる。
  4. attribcast2 を選択、VEXpression に
    @Cd = rand(@ptnum);
    としてアトリビュートを一つ追加。
  5. この際に情報パネルで新しく追加された Cd を見ると、3flt64 となっているのがわかる。
つまり、32bit または 64bit の挙動の切り替えに際して VEX コードの書き換えは不要。

4. Vellum シミュレーション

Vellum シミュレーション作成時の対処方法を以下かに説明する。基本的には、上と同じで Attribute Cast を使用する。

4-1: 元シーンの作成

  1. Grid を作成 (grid1) 。
    • Size は 10x10 (デフォルトのまま)
    • Rows と Columns を 50x50 に変更。
  2. grid1 の出力に Vellum Configure Cloth を追加 (vellumcloth1)。
    • Density を 0.2 (好きな値にしてよい)
    • Pin Points に 0 2450 2499 (四隅のうち3点) を追加。
    vellumcloth1 の出力に Vellum Solver を追加 (vellumsolver1)。
こうして作ったセットアップを、上の例と同様、原点から遠くに移動してシミュレーションを実行し、また原点に戻す。

4-2: 原点から移動し戻す

  1. Transform を作成 (transform3)。
    • Translate X, Y, Z にそれぞれ 10_000 を入力。
    • grid1 と vellumcloth1 の間に挿入。
  2. transform3 を複製 (transform4)。
    • Invert Transformation をオンにする。
    • vellumsolver1 の後に接続。
この状態で Play ボタンを押せば非常にカクカクとして再生される。

4-3: 修正方法 Attribute Cast

  1. Attribue Cast を作成 (attribcast2)。
    • Set Preferred Precision を 64-bit に変更。
    • Attribute Casts 以下の Attributes に * を挿入。
    • Precision を 64-bit float にする。
        これによりすべてのアトリビュートが 64ビットとみなされる。
    • grid1 と transform3 の間に挿入。
これを再生すれば、滑らかなクロスシミュレーションとなる。

端の部分を見ると、こちらの方がスムーズなのがわかる。

なお、64ビットによるジオメトリ処理は32ビットよりも CPU にも GPU にも負担をかけるが、昨今の64ビットCPU にかかる負担は大きいものではないが、低価格・低機能の GPU では描画速度が著しく遅くなる可能性がある。

シーンファイル

0 件のコメント:

コメントを投稿