AOV

任意の出力変数(AOV)を使用すると、コンポジット用ソフトウェアで使用するビューティ レンダリング以外のイメージを出力できます。

ライト パス エクスプレッション AOV

Arnold のライト パス エクスプレッションを使用すると、ビューティ RGBA AOV を最も一般的に使用する AOV に指定して、特定の AOV にライトを出力できます。シェーダから特定の AOV に書き込むのではなく、正規表現を使用して特定のライト パスを抽出するのに LPE を使用できます。ビルトインの LPE は一般的な場合に使用できます。

詳細については、「ライト パス エクスプレッション AOV」を参照してください。

ビルトイン AOV

ビルトイン LPE とは別に、次のビルトイン AOV を使用できます。

名前 タイプ
A FLOAT アルファ チャネル
Z FLOAT Z 深度
opacity RGB RGB チャネル アルファごと
volume_opacity RGB RGB チャネル アルファごと、ボリュームを使用する場合のみ
ID UINT オブジェクトの id パラメータ
P VECTOR ワールド空間の位置
Pref VECTOR リファレンス空間の位置、Pref ユーザ データから
N VECTOR Normal
motionvector VECTOR2 スクリーン空間モーション ベクトル
shadow_matte RGBA シャドウ
cputime FLOAT ピクセルのレンダリングに必要な時間
raycount FLOAT ピクセルのレンダリングのためにトレースするレイの数
shader NODE ポインタからシェーダ ノード、フィルタとドライバ用
object NODE ポインタからオブジェクト ノード、フィルタとドライバ用

Custom AOVs

シェーダは、LPE とビルトイン AOV でカバーされない場合にカスタム AOV を出力できます。たとえば、マット、マスク、アンビエント オクルージョン、テクスチャなどを出力する場合です。AOV はカメラ レイにのみ書き込まれます。

次に、float AOV にノイズ テクスチャを書き込むシェーダの例を示します。

write_aov.cpp

#include <ai.h>

AI_SHADER_NODE_EXPORT_METHODS(WriteAovMtd);

struct WriteAovData
{
   AtString aov_name;
};

enum WriteAovParams
{
   p_aov_name,
};

node_parameters
{
   AiParameterStr("aov_name", "");
   AiMetaDataSetBool(nentry, "aov_name", "linkable", false);
}

node_initialize
{
   AiNodeSetLocalData(node, new WriteAovData());
}

node_update
{
   // register AOV
   WriteAovData *data = (WriteAovData*)AiNodeGetLocalData(node);
   data->aov_name = AiNodeGetStr(node, AtString("aov_name"));
   AiAOVRegister(data->aov_name, AI_TYPE_FLOAT, AI_AOV_BLEND_OPACITY);
}

node_finish
{
   WriteAovData *data = (WriteAovData*)AiNodeGetLocalData(node);
   delete data;
}

shader_evaluate
{
   const WriteAovData *data = (WriteAovData*)AiNodeGetLocalData(node);
   const float noise = AiPerlin3(sg->P);

   // write AOV only if in use
   if ((sg->Rt & AI_RAY_CAMERA) && AiAOVEnabled(data->aov_name, AI_TYPE_FLOAT))
      AiAOVSetFlt(sg, data->aov_name, noise);

   sg->out.FLT() = noise;
}

node_loader
{
   if (i != 0)
      return false;
   node->methods     = WriteAovMtd;
   node->output_type = AI_TYPE_FLOAT;
   node->name        = "write_aov";
   node->node_type   = AI_NODE_SHADER;
   strcpy(node->version, AI_VERSION);
   return true;
} 
options
{
 AA_samples 9
 outputs "my_custom_aov FLOAT /out/arnold1:gaussian_filter /out/arnold1:exr"
 aov_shaders "customaov"
 camera "camera"
 GI_diffuse_depth 1
 GI_specular_depth 1
 GI_diffuse_samples 3
}

write_aov
{
 name customaov
 aov_name "my_custom_aov"
}

driver_openexr
{
 name /out/arnold1:exr
 filename "av-custom_aov.exr"
}

gaussian_filter
{
 name /out/arnold1:gaussian_filter
}

persp_camera
{
 name camera
 position 0 15 15
 look_at 0 0 0

}

sphere
{
 name ball
 radius 10
}