任意の出力変数(AOV)を使用すると、コンポジット用ソフトウェアで使用するビューティ レンダリング以外のイメージを出力できます。
Arnold のライト パス エクスプレッションを使用すると、ビューティ RGBA AOV を最も一般的に使用する AOV に指定して、特定の AOV にライトを出力できます。シェーダから特定の AOV に書き込むのではなく、正規表現を使用して特定のライト パスを抽出するのに LPE を使用できます。ビルトインの LPE は一般的な場合に使用できます。
詳細については、「ライト パス エクスプレッション 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 |
ポインタからオブジェクト ノード、フィルタとドライバ用 |
シェーダは、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
}