API に関する FAQ

AiNodeGet* と AiShaderEvalParam* の違いは何ですか?

 Click here to expand...

シェーダ パラメータを AiShaderEvalParam * を使用して評価することと AiNodeGet * を使用して評価することの主な違いは、前者はシェーダ ネットワークをサポートしますが、AiNodeGet * は他のシェーダがそこに接続されている場合でも評価せずに「静的な」パラメータ値を返すだけであるという点です。 その他の違いは、AiShaderEvalParam* はシェーダの shader_evaluate メソッド内からのみ呼び出すことができますが、AiNodeGet* はどこからでも呼び出すことができるという点です。 

また、AiShaderEvalParam* への呼び出しは、AiNodeGet* への同等の呼び出しよりオーバーヘッドがかなり少ないという点も挙げられます。その理由は次のとおりです。

  • AiNodeGet* は、低速の文字列比較を必要とする文字列(ハッシュなど)に対して作用します。
  • AiShaderEvalParam* はシェーダ ノードで機能するように最適化されていますが、AiNodeGet* は任意のノード タイプで使用できるため、頻繁な内部チェックや記録が必要です。

どうすれば、シェーダからユーザ データを取得できますか?

 Click here to expand...

shader_evaluate で、ユーザ データのストレージ修飾子(定数、均等、可変)にかかわりなく、AiUDataGet* API を使用してください。 定数ユーザ データの場合、AiNodeGet* を使用してユーザ データを取得することもできます(しかし非常に低速です)。 パフォーマンス上の理由から、シェーダの shader_evaluate メソッドから AiNodeGet* を呼び出さないでください。 node_initialize および node_update から AiNodeGet* を呼び出すことは構いません。これらのメソッドは 1 回しか呼び出されないからです。

AiNodeGet* と AiUDataGet* の違いは何ですか?

 Click here to expand...

AiNodeSet/Get* API はシーンの構築と操作を目的としていますが、AiUDataGet* API はシェーディング時に呼び出されることを目的としています。

シェーダ パラメータ評価は AiShaderEvalParam* でキャッシュされますか? 

 Click here to expand...

Arnold はどのパラメータ評価もキャッシュしません(今後のリリースでは予定されています)。 同じパラメータを 2 回評価すると、シェーディング ネットワーク全体を 2 回評価することになります。そのため、シェーダでは評価の重複をしないように注意する必要があります。

shader_evaluate の内部で AiNodeGetLink メソッドを使用できますか?

 Click here to expand...

技術的には可能です。AiNodeGetLink()AiNodeGetFlt()、および類似する API を shader_evaluate 内で呼び出すことができます。 しかし、これは推奨されていません。なぜなら、これらの呼び出しでは、レンダリング時間に大きな影響を与える可能性のある文字列比較やハッシュ検索など、負荷の高い処理が実行されて時間がかかるためです。 解決方法は、node_initialize または node_update コールバックでこれらの呼び出しを事前に計算することです。これらのコールバックは、シェーディング サンプルごとではなく、それぞれセッションごとまたは IPR を渡すたびに 1 回実行されます。

異方性鏡面反射光を使用する

 Click here to expand...

マイクロファセット BSDF には、U と V の接線方向の粗さが個別にあります。 粗さが同じ場合は、等異方性反射になります。 粗さが異なる場合は異方性反射となり、接線ベクトルは、U 接線の方向を示すようにマイクロファセット BSDF に渡される必要があります。 V 接線方向は、法線と V 方向から派生します。

接線を計算する最も簡単な方法は sg->dPdu を使用することです。接線は UV 座標の U 軸に沿った方向です。 これにより、ユーザは UV 座標を変更して接線方向を制御できます。 UV 座標が指定されていない場合、このベクトルはゼロになり、自動接線を使用できます。 たとえば、シェイプが球状で、縦方向に沿っているかのように計算された接線があるとします。

 

ユーザ データからカスタム接線を使用することができますが、任意の方向の異方性反射を取得する場合、通常は、上記のように「回転」マップを組み合わせるだけで十分です。

ノードの可視性パラメータおよび側面性パラメータはどのように機能しますか?

 Click here to expand...

 これらのパラメータは次の値を使用して定義されたマスクです。

 

レイのタイプ16 進値説明
AI_RAY_UNDEFINED 0x00 未定義タイプ
AI_RAY_CAMERA 0x01 カメラから発生するレイ
AI_RAY_SHADOW 0x02 光源に向かうシャドウ レイ
AI_RAY_DIFFUSE_REFLECT 0x20間接拡散反射レイ
AI_RAY_DIFFUSE_TRANSMIT 0x04間接拡散反射透過レイ
AI_RAY_SPECULAR_REFLECT0x50間接鏡面反射レイ
AI_RAY_SPECULAR_TRANSMIT 0x08間接鏡面反射透過レイ
AI_RAY_VOLUME0x10間接ボリューム散乱レイ
AI_RAY_SUBSURFACE0x80サブサーフェス スキャッタリング プローブ レイ(内部使用)
AI_RAY_ALL 0xFF すべてのレイ タイプのマスク

 

既定では、可視性と側面性の両方が 255 (0xFF)に設定されています。 ポリメッシュがカメラ レイに対してのみ表示されるようにする場合、その可視性値は AI_RAY_CAMERA です。 カメラ レイおよび反射レイに対して表示されるようにする場合、AI_RAY_CAMERA、AI_RAY_DIFFUSE_REFLECT、AI_RAY_SPECULAR_TRANSMIT を設定します。

どの値が disp_map ポリメッシュ パラメータをサポートしていますか?

 Click here to expand...

パラメータに接続されたシェーダが浮動小数点値を出力する場合は、サーフェス法線に沿ってディスプレイスメントが発生します。 しかし、出力が 3D ベクトルの場合、それ自体がオブジェクトの座標のディスプレイスメント ベクトルになります。

Arnold では、接線空間ディスプレイスメント ベクトルのネイティブ サポートはありません。 ただし、受け取る接線空間ベクトルを解釈し、それらを(N, dPdu, dPdv)によって定義される座標空間にその場で変換するディスプレイスメント シェーダを実装できます。

どうすればその後のレイ ヒットでクエリーできるレイにユーザデータをアタッチできますか? 

 Click here to expand...

メッセージ転送メカニズムを使用して、レイ ツリーに渡されているシェーディング状態に任意のデータをアタッチできます。 たとえば、次のようになります。

options.background に接続されたシェーダのアルファの出力は、ビューティ パスにどのような影響を与えますか?

 Click here to expand...

ビューティ パスのアルファ コンポーネントは、ピクセルの累積的な不透明度を表します。これは、out_opacity シェーダ グローバルによって決定されており、RGBA シェーダの結果の「A」コンポーネントではありません。

別のカーブ パラメータを入力するにはどのようにすればよいですか?

 Click here to expand...

指定されたカーブの可変値の数は以下の公式に基づいています。

  • num_segments = (num_points - 4)/vstep + 1
  • num_varying = num_segments + 1

各カーブ ベースのステップ サイズ(vstep):

  • ベジェ: 3
  • B-スプライン: 1
  • catmull-rom: 1

基本的には、各セグメント値の開始点に 1 つの可変値があり、カーブの終点には 1 つの追加の値があります。 これは、可変値が開始点からそれぞれの終点までスムーズに補間され、前後のセグメントに連続するようにするためです。 各カーブ ベースは、制御点の合計数に基づいてセグメントの数を別々に定義します。したがって、前述のステップ サイズは異なります。

いくつかの例を挙げます。

  • 13 個の制御点があるベジェ ベースのカーブを指定するとします。 この場合、(13-4)/3+1 = 4 個のベジェ セグメントがあることを意味し、半径 5 が必要です。
  • 14 個の制御点がある B-スプラインまたは Catmull-Rom カーブを指定するとします(ベジェの制御点の数は常に 3 の倍数 +1 になるため、ベジェでこうした指定を行うことはできません)。これは、(14-4)/1+1 = 11 個のセグメントがあることを意味し、半径 12 が必要です。

nass ファイルのポリメッシュ ノードに面の配列が定義されていない場合はどうなりますか?

 Click here to expand...

N 面が定義されていない場合、Arnold はポリゴンメッシュ ノードを三角メッシュと見なします。 また、配列ではなく単一値を定義することもできます。その場合、Arnold はすべての面で、その値を頂点の数として認識します。

ノードでユーザ データ パラメータを宣言するにはどのようにすればよいですか?

 Click here to expand...

.ass ファイルでユーザ定義パラメータを追加するには、まず AiNodeDeclare()が API で行うのと同様にパラメータを宣言する必要があります。 これはすべてのノードタイプに対して実行することができ、オプション ブロックまたは現在のカメラからグローバル情報を読み取るプロシージャル DSO を作成する場合に非常に便利です。これは、Renderman RiAttribute 呼び出しおよび RiOptions 呼び出しに似ています。1 つだけ挙げるとすれば、Arnold はステート マシンではないため、プロシージャルでデータを複製しなければならない場合があるということです。

宣言行は、AiNodeDeclare と同様のパラメータを取ります(node、name、declaration)。

  • node は暗黙的なパラメータで、現在宣言されているノードにマップされます。
  • name は、最初の引数であるユーザパラメータ名です。
  • declaration は、class と type です。
    • class := { constant, uniform, varying }
    • type := { BYTE, INT, BOOL, FLOAT, RGB, POINT, STRING など }

宣言後に、パラメータは通常のパラメータのように設定できます。

検索パスは環境変数の拡張子をサポートしますか?

 Click here to expand...

texture_searchpath、procedural_searchpath、および plugin_searchpath オプションは、角括弧で区切られた環境変数の拡張子をサポートします。 これは、以下のように API と内部の .ass ファイルの両方を使用して機能します。

進行中のレンダリングの出力イメージを表示する方法はありますか?

 Click here to expand...

一般のディスプレイ ドライバの外部でレンダリングの進行状況を表示するための対策があります。

  • 出力をタイル exr に設定します。zip で十分です。
  • バケット スキャン方式を「top」に設定します。
  • Imf_disp のようなビューアを使用します。

モーション ブラー キーではどのようなパラメータがサポートされていますか?

 Click here to expand...

ジオメトリ:

  • すべてのシェイプノード: 行列。
  • ポリメッシュ ノード: vlist と nlist。
  • カーブ ノード: 制御点、半径、方向。
  • 点ノード: 点、半径、アスペクト、回転。

カメラ:

  • 行列および関連付けられた位置属性/方向属性(position、look_at、up など)。

ライト:

  • 行列および関連付けられた位置属性(position、look_at、up、direction)。

シェーダ:

  • gobo.rotate 以外には、ビルトインの Arnold シェーダにおいては何も補間されません。

ポリメッシュで subdiv_iterations がゼロに設定されている場合、subdiv_type = none のときと subdiv_type = linear のときの違いは何ですか?

 Click here to expand...

subdiv_type が linear に設定されているポリメッシュ ノードと subdiv_iterations がゼロに設定されているポリメッシュ ノードでは、ポリメッシュは提供されたユーザ定義のシェーディング法線を無視し、それがある場合は警告を出します。 subdiv_type が none に設定されているポリメッシュ ノードと subdiv_iterations がゼロに設定されているポリメッシュ ノードでは、ユーザが定義した法線は無視されません。 これは、ユーザが生成されるポリメッシュの法線を設定している場合には、出力結果がかなり変わる可能性があることを意味します。

Z-深度 AOV はどのように保存されますか?

 Click here to expand...

既定では、Z AOV には、カメラの近接クリッピング平面と遠方クリッピング平面の範囲内にある平面距離が非正規化された深度データとしてアルファ チャネルが保存されます。

min_pixel_width はすべてのレイに適用されますか?

 

 Click here to expand...
プリプロセスの手順として、min_pixel_width はヘアに適用されます。そのため、すべての交点が影響を受けます。確率的不透明度を適用する場合、ヘアの不透明度はカーブ半径の増加を補正するように自動的に下がります。 シェーダで確率的透明度を使用する方法については、クロージャのマニュアルを参照してください。
透明なヘアのレンダリングはパフォーマンスへの影響が大きいため、min_pixel_width で各 AA サンプルがゆっくりレンダリングされます。 ただし、ノイズが少なくなると、通常はレンダリング時間全体が短くなります。

 

min_pixel_width が適用されるのは、ヘアの場合はカメラ レイ(シャドウ レイではない)、ポイントの場合はカメラ レイとシャドウ レイのみです。

パラメータ接続ルール

 Click here to expand...

出力の個々のコンポーネントを入力または入力コンポーネントに接続することがサポートされています。 以下は .ass 内のすべての有効な接続です。

また、配列要素のリンクがサポートされています。そのため、シェーダの出力は入力配列内の特定の配列要素にリンクします。 複数の出力はサポートされていません。

 

 

 

  • No labels