• 日本

    現地通貨での販売価格、キャンペーンやイベント情報、オンラインによる購入、などをご覧いただくために、お住まいの国のサイトにリダイレクトします

    Stay on our U.S. site

Keyboard ALT + g to toggle grid overlay

レンダーマジック
Houdini から
ダイレクトアクセス

面倒な設定も必要なく、Houdini との連携機能をすぐに使用できます。

Arnold とは?

Arnold は、先進的なモンテカルロ方式のレイ トレーシング レンダラーです。データ量の大きなシーンの処理も十分にこなせるパワフルな性能で、安心してレンダリングを行えます。アーティストにとって使いやすい UI を備え、Houdini の機能にシームレスに適合するように設計されています。世界中のビジュアル エフェクト業界で数々のトップ アーティストに選ばれているレンダラーです。

対応ツール:

アーティストに使用されるツールと連携

Arnold for Houdini が選ばれる理由とは?

  • 高性能

  • Houdini に合わせてカスタマイズされた機能

  • 柔軟性

  • 拡張性

  • プロフェッショナル仕様

高負荷なレンダリングもこなす圧倒的なパワー

大容量のデータセットを得意とする Arnold なら、複雑でデータ量の多いシーンでも難なくこなします。レンダリング中にエラーが起きないか心配する必要はありません。

Image courtesy of Heribert Raab

Houdini とシームレスに統合

Arnold for Houdini (HtoA) は、Houdini を使用しているアーティストのために開発されたプラグインです。Houdini の一部のように自然な感覚で Arnold を使用できます。Houdini 独自の機能にもすべて対応し、アーティストはより短時間で効率的に作業することが可能になります。

パワーを選択

レンダリングに CPU と GPU のどちらを使うかを選択できます。GPU を使用してアセットの反復プレビューをスピーディーに実行し、その後 CPU を使用して、負荷の高いシーンの拡張やレンダリングを行うことができます。

オープンで拡張可能なアーキテクチャー

オープン アーキテクチャーの拡張性を活かして Arnold をパイプラインに統合し、プロジェクトのニーズに合わせてカスタマイズしましょう。カメラ、ライト フィルター、出力ドライバー、シェーダーをカスタマイズできます。

Image courtesy of Serjan Burlak

高品質を実現する機能

HtoA は、Arnold の全機能に対応します。ライティングやシェーダーなどのレンダリング効果を細かくコントロールできる、次のような機能を搭載しています。

  • シェーディング ネットワーク エディター:カスタム シェーダーを作成できるほか、ボリューム ディスプレイスメントなどのユニークなエフェクトも作成できます。
  • カスタム AOV(任意の出力変数/パス):コンポジットの法線、Z 深度、位置、ID マスクなど、任意の数の AOV(パス)をレンダリングできます。
  • Alembic プロシージャル:Alembic ファイルを変換せずに直接レンダリングできます。
  • 高品質のボリューム レンダリング:煙、雲、霧、火砕流、炎などの複雑なエフェクトをレンダリングできます。

Image courtesy of Yasin SINIK

ボリューム フラクタルを OSL でレンダリング

  • ボリューム フラクタルを OSL でレンダリング

    コンピューター アーティスト

    Juraj Tomori 氏

    このチュートリアルでは、Open Shading Language (OSL) を使ってボリューム フラクタルのシーンを作成する方法を解説します。シンプルなシーンの設定方法から、OSL を使用してシェーダーでフラクするまでの手順を詳しく説明します。 チュートリアルを最後まで確認すれば、同じようなシーンを作成できるようになるでしょう。

    他のチュートリアルも見る(英語)

    このチュートリアルでは、Open Shading Language (OSL) を使ってボリューム フラクタルのシーンを作成する方法を解説します。シンプルなシーンの設定方法から、OSL を使用してシェーダーでフラクするまでの手順を詳しく説明します。 チュートリアルを最後まで確認すれば、同じようなシーンを作成できるようになるでしょう。

  • 球のシェーダー

    この例では、レンダリングするシーンをシェーダーで定義し、シェーディングを適用した各サンプルの密度の値を出力します。指定した値の範囲内でボリュームをレンダリングするには、ボックスを作成し、これをボリュームとしてレンダリングします。

    手順を見る

    この例では、レンダリングするシーンをシェーダーで定義し、シェーディングを適用した各サンプルの密度の値を出力します。指定した値の範囲内でボリュームをレンダリングするには、ボックスを作成し、これをボリュームとしてレンダリングします。

    手順を見る

  • マンデルバルブ フラクタル

    OSL でシェイプを定義する方法が分かったところで、もっと面白いシェイプの定義に移りましょう。マンデルブロ フラクタルは複雑な 2D 平面で定義されるシェイプ、マンデルバルブ フラクタルは 3D 空間で定義されるシェイプです。マンデルブロは 3D で定義されるシェイプではありませんが、魅力的なシェイプのマンデルバルブはマンデルブロがベースになっています。

    手順を見る

    OSL でシェイプを定義する方法が分かったところで、もっと面白いシェイプの定義に移りましょう。マンデルブロ フラクタルは複雑な 2D 平面で定義されるシェイプ、マンデルバルブ フラクタルは 3D 空間で定義されるシェイプです。マンデルブロは 3D で定義されるシェイプではありませんが、魅力的なシェイプのマンデルバルブはマンデルブロがベースになっています。

    手順を見る

  • 発光するマンデルバルブ フラクタル

    ここまでで美しいシェイプを作成できるようになりましたが、どれも色がグレーです。軌道トラップという手法を使ってシェイプに色を付けてみましょう。このシェーダーでは 5 種類の軌道トラップを使えます。

    手順を見る

    ここまでで美しいシェイプを作成できるようになりましたが、どれも色がグレーです。軌道トラップという手法を使ってシェイプに色を付けてみましょう。このシェーダーでは 5 種類の軌道トラップを使えます。

    手順を見る

  • フラクタルの品質設定

    ボリュームに関するシーンでは、バウンディング ボックス オブジェクトのボリュームのステップ サイズと、バウンディング ジオメトリのサイズとシェイプという 2 つのオプションを使ってディテールの量をコントロールできます。その他に、標準の Arnold ROP 品質設定も使用できます。

    フラクタルの品質設定に関する詳細

    ボリュームに関するシーンでは、バウンディング ボックス オブジェクトのボリュームのステップ サイズと、バウンディング ジオメトリのサイズとシェイプという 2 つのオプションを使ってディテールの量をコントロールできます。その他に、標準の Arnold ROP 品質設定も使用できます。

    フラクタルの品質設定に関する詳細

  • チュートリアル球のシェーダー

    まずは簡単な例で、テクニックを見ていきましょう。この例では、レンダリングするシーンをシェーダーで定義し(ここでは球ですが、後でフラクタルについても説明します)、シェーディングするサンプルごとに密度値を出力します。指定した値の範囲内でボリュームをレンダリングするには、ボックスを作成し、これをボリュームとしてレンダリングします。

    • 最初に、[Uniform Scale](均等スケール)を 2 に設定してボックスを作成します。[Volume Step Size](ボリューム ステップ サイズ)を 0 よりも大きい値(0.1 など)に設定して、メッシュをボリュームとしてレンダリングします。
    • Arnold ROP、カメラ、ライトを作成し、結果を表示します。
    • [Material Output](マテリアル出力)ノードの[Volume](ボリューム)スロットに接続する[Standard Volume](標準ボリューム)でシェーダーを作成します。
    • [Render View](レンダー表示)ペインの[Render](レンダー)ボタンをクリックすると、ボリュームを示す立方体がレンダリングされます

    さて、シェーダーで処理する原版ができました。これでシェイプを定義します。現在の設定では、ボックス状の境界内の密度が均一に出力されて 1 つのボックスになるようになっています。これを球に変えて、ちょっと面白くしてみましょう。ここでは、球状のボリュームを、次の方法でインプリシット ボリュームとして定義します:中心までの距離が球の半径と同じか、それ以下のポイントはすべて密度です。残りのポイントは空です。この定義を疑似コードで表すと、次のようになります。

    if (length(P_world) <= sphere_radius)
        density = 1
    else
        density = 0
    

    P_world は、シェーディングするサンプルのワールド空間の位置を示し、length() はベクトルの長さ(ユークリッド距離)を返します。これは、次のようなシェーディング ネットワークと解釈できます。状態ベクトルがワールド空間(P)のシェーディング ポイントを出力し、Compare(比較)ノードが球の半径と同じか、それ以下に設定されています。

    ここではシェーディング ノードのみを使用してシェイプを定義しましたが、疑似コードを使用するなど、シェイプをプログラムで定義すれば、さらに詳細にコントロールできます。実際、OSL を利用すれば、簡単にこの処理を行うことができます。もう一度 OSL で球を作成し、シェーディング ネットワークがどのように変わるかを見てみましょう。その場合、球のシェーダーは次のようになります。

    sphere_shader.osl

    shader sphere_shader(
        float sphere_radius = 1.0,
        output float density = 0.0
    )
    {
        if (length(P) <= sphere_radius)
            density = 1.0;
        else
            density = 0.0;
    }
    

    sphere_shader はシェーダーの名前です。float sphere_radius は、既定の値でノードのパラメーターを定義します。output float は、ノードの出力タイプを定義し、P は、Arnold が提供するグローバル変数を示します。ご覧のように、OSL コードは前述の疑似コードによく似ています。

    sphere_shader.osl を保存し、このシェーダーの保存先フォルダをポイントするように ARNOLD_PLUGIN_PATH 環境変数を設定します。たとえば、houdini.env ファイルに次のように記述します。 ARNOLD_PLUGIN_PATH = /path/to/folder/with/osl/shaders

    ARNOLD_PLUGIN_PATH = /path/to/folder/with/osl/shaders
    

    シェーダーのパスは一度設定すると、Houdini の再起動時に SHOP に表示されます。

    ご覧のように、かなりシンプルなネットワークで同じ結果を出力できるようになりました。Houdini の再起動が必要になるのは、新しいシェーダーを作成する場合か、シェーダーの出力パラメーターや入力パラメーターを修正する場合のみです。OSL コードを変更する場合、Houdini の再起動は必要ありません。変更内容は、[Render](レンダー)ボタンを次にクリックしたときに反映されます。球の半径を扱う場合、場合によっては下図のような結果が得られることがあります。これは、球がバウンディング オブジェクトよりも大きいため、どちらかのサイズを調整する必要があるということです。

  • チュートリアルマンデルバルブ フラクタル

    OSL でシェイプを定義する方法が分かったところで、もっと面白いシェイプの定義に移りましょう。マンデルブロ フラクタルの定義には複雑な 2D 平面が使用され、各サンプルが無限大に発散するか、それとも範囲内にとどまるかが繰り返し評価およびテストされます。マンデルバルブ フラクタルは、Daniel White 氏と Paul Nylander 氏が構築した 3D 空間で定義されます。マンデルブロは 3D で定義されるシェイプではありませんが、魅力的なシェイプのマンデルバルブはマンデルブロがベースになっています。新しい OSL シェーダーを作成して、シーンを少しだけ変更してみましょう。

    mandelbulb_shader.osl

    shader mandelbulb_shader(
        float power = 8.0,
        int julia_enable = 0 [[ string widget = "boolean" ]],
        vector julia_coordinate = vector(0, 0, 0),
        int max_iterations = 150,
        float max_distance = 20.0,
        output float density = 0
    )
    {
        point P_in = P;
        point Z = P;
        int i;
        for (i = 0; i < max_iterations; i++)
        {      
            float distance = length(Z);
            // convert to polar coordinates
            float theta = acos(Z[2] / distance);
            float phi = atan2(Z[1], Z[0]);
             
            // scale and rotate the point
            float zr = pow(distance, power);
            theta *= power;
            phi *= power;
             
            // convert back to cartesian coordinates
            point new_Z = zr * point( sin(theta)*cos(phi), sin(phi)*sin(theta), cos(theta) );
            // update our point in normal or julia mode
            if (julia_enable == 0)
            {
                Z = new_Z + P_in;
            }
            else
            {
                Z = new_Z + julia_coordinate;
            }
            distance = length(Z);
            if (distance > max_distance) break;
        }
        // define density: 1 where point did not escape, 0 where point escaped to infinity
        if (i == max_iterations)
            density = 1.0;
        else
            density = 0.0;
    }
    

    Houdini で作成したシーンを再ロードし、新しい mandelbulb_shader ノードをシェーディング ネットワークにドロップします。バウンディング ジオメトリをボックスから球に変更します。これによりシェイプがより安定し、レンダリングが効率的になります。シェーダーが 1 または 0 しか出力しないため、multiply ノードを作成して密度を上げます。

    power パラメーターをさまざまに調整し、julia_enable(ジュリアを有効)にして julia_coordinates(ジュリア座標)を設定することでジュリア モードを試します。パラメーターをアニメーション化して、アニメーションで動く面白いシェイプを作成できます。

  • チュートリアル発光するマンデルバルブ フラクタル

    ここまでで美しいシェイプを作成できるようになりましたが、どれも色がグレーです。軌道トラップという手法を使ってシェイプに色を付けてみましょう。次のシェーダーでは、5 種類の軌道トラップを使えます。また、length2() と distPointPlane() という 2 つのヘルパー関数も使用できます。

    mandelbulb_colors_shader.osl

    // squared length
    float length2(vector vec)
    {
        return dot(vec, vec);
    }
    // point to plane distance
    float distPointPlane(vector pt, vector plane_n, vector plane_point)
    {
        float sb, sn, sd;
        vector point_proj;
        sn = -dot( plane_n, (pt - plane_point));
        sd = dot(plane_n, plane_n);
        sb = sn / sd;
        point_proj = pt + sb * plane_n;
         
        return length(pt - point_proj);
    }
    shader mandelbulb_colors_shader(
        float power = 8.0,
        int julia_enable = 0 [[ string widget = "boolean" ]],
        vector julia_coordinate = vector(0, 0, 0),
        int max_iterations = 150,
        float max_distance = 20.0,
        output matrix out = 0
    )
    {
        point P_in = P;
        point Z = P;
        int i;
        // orbit traps
        float orbit_coord_dist = 100000;
        float orbit_sphere_dist = 100000;
        point orbit_plane_origin = point(0.0);
        vector orbit_plane_dist = vector(100000);
        for (i = 0; i < max_iterations; i++)
        {      
            float distance = length(Z);
            // convert to polar coordinates
            float theta = acos(Z[2] / distance);
            float phi = atan2(Z[1], Z[0]);
             
            // scale and rotate the point
            float zr = pow(distance, power);
            theta *= power;
            phi *= power;
             
            // convert back to cartesian coordinates
            point new_Z = zr * point( sin(theta)*cos(phi), sin(phi)*sin(theta), cos(theta) );
            // update our point in normal or julia mode
            if (julia_enable == 0)
            {
                Z = new_Z + P_in;
            }
            else
            {
                Z = new_Z + julia_coordinate;
            }
            distance = length(Z);
            if (distance > max_distance) break;
            // orbit traps
            orbit_coord_dist = min(orbit_coord_dist, fabs( length2(Z - P_in) ));
            orbit_sphere_dist = min( orbit_sphere_dist, fabs( length2(Z - point(0)) - 2.0) );
            orbit_plane_dist[0] = min( orbit_plane_dist[0], distPointPlane(Z, vector(1.0, 0.0, 0.0), orbit_plane_origin) );
            orbit_plane_dist[1] = min( orbit_plane_dist[1], distPointPlane(Z, vector(0.0, 1.0, 0.0), orbit_plane_origin) );
            orbit_plane_dist[2] = min( orbit_plane_dist[2], distPointPlane(Z, vector(0.0, 0.0, 1.0), orbit_plane_origin) );
        }
        // orbit traps
        orbit_coord_dist = sqrt(orbit_coord_dist);
        orbit_sphere_dist = sqrt(orbit_sphere_dist);
        // define density: 1 where point did not escape, 0 where point escaped to infinity
        float density;
        if (i == max_iterations)
            density = 1.0;
        else
            density = 0.0;
         
        // output values
        out[0][0] = density;
        out[0][1] = orbit_coord_dist;
        out[0][2] = orbit_sphere_dist;
        out[0][3] = orbit_plane_dist[0];
        out[1][0] = orbit_plane_dist[1];
        out[1][1] = orbit_plane_dist[2];
    }
    

    現在、OSL ノードで出力できるのは 1 つのみという制限があるのでご注意ください。この回避策として、16 の浮動小数点値(4x4 の変換行列)で構成される行列タイプを出力できます。1 つのノードから複数の値を出力するには、行列の値を 1 つにまとめ、次のヘルパー OSL シェーダーを使ってシェーディング ネットワークで抽出する方法があります。

    get_matrix_element.osl

    shader vft_get_matrix_element(
        matrix mat = 1,
        int row = 0,
        int column = 0,
        output float element_out = 0.0
    )
    {
        element_out = mat[row][column];
    }
    

    マンデルバルブ シェーダーをベースに同じインデックスを使って値を抽出し、シェーディングに使用することができます。ここでは創造性を発揮してさまざまな値を試したり、値を組み合わせたりすることで、視覚的に面白いイメージを生成できます。次のイメージでは、Standard Volume(標準ボリューム)ノードで Scatter Color(スキャッター カラー)パラメーターを実行している 2 つの色を軌道トラップを使って混ぜ合わせています。

    次のイメージでは、軌道トラップを使ってボリュームに黒体放射を適用しています。

  • 詳細はこちらフラクタルの品質設定

    ボリュームのシーンでディテールの量をコントロールする 1 つ目のオプションは、バウンディング ボックス オブジェクトのボリュームのステップ サイズです。値を小さくするほど、レンダリングするボリュームに細かなディテールを加えられます。違いが分からなくなるまで値を小さくしてみてください。ただし、値が小さすぎるとレンダリングに時間がかかります。

    ステップ サイズ:0.1

    ステップ サイズ:0.6

    レンダリング時間に影響するもう 1 つの要素は、バウンディング ジオメトリのサイズとシェイプです。バウンディング シェイプが不必要に大きいと、空白のスペースのレンダリングにパワーが消耗されるため、できるだけ空白ができないよう小さめに設定します。フラクタルのリファインメントに影響するもう一つのオプションは、OSL マンデルバルブ ノードの[Max Iterations](最大反復回数)パラメーターです。このパラメーターを、視覚的に必要なだけ高く設定します。ただし高すぎると、レンダリングに時間がかかります。

    反復:150

    反復:10

    標準の Arnold ROP 品質設定も使用できます。発光フラクタルをレンダリングする場合は、レンダリングを 2 つのパスに分けて、ひとつのパスで発光ライティングを、もう一つのパスでシーンのライティングをレンダリングする方法がお勧めです。理由は、2 つのライティングは設定方法がまったく異なるため、同時にレンダリングするよりも別々にレンダリングした方が速く完了するからです。

閉じる

コミュニティに参加

ヘルプが必要な場合は、詳細な解説が記載されたドキュメントを参照するか、開発チームやコミュニティのサポートをご利用ください。疑問に対する答えがすぐに見つかります。豊富なリソースを利用して、素晴らしい作品の実現にお役立てください。

ヘルプが必要な場合は、詳細な解説が記載されたドキュメントを参照するか、開発チームやコミュニティのサポートをご利用ください。疑問に対する答えがすぐに見つかります。豊富なリソースを利用して、素晴らしい作品の実現にお役立てください。

Arnold を体験

最高クラスの 3D レンダラーを体験してみませんか? 30 日間の無償体験版で HtoA をお試しください。

Sign up for the newsletter

Thank you for signing up!

Find out what’s new with Arnold. We’ll send you the occasional email when we've got new tutorials or product updates for you.