On this page |
VEXのgather
ループステートメントを使えば、光線をシーンに送信して、その結果の情報をかき集めることができます。
gather(vector origin, vector direction, ...) { // 他のサーフェスに当たった光線のためのステートメント } else { // どのサーフェスにも当たらなかった光線のためのステートメント }
originとdirectionの引数の後に、追加する引数は、キーワード/値のペアとして解釈されます。
gather(origin, dir, "samples", 100) { ... }
Note
0個のサンプルを指定しても、最低1個のサンプルを受け取ります。
ライトの包含/除外オプション ¶
"categories
",
string
="*"
“category”タグによって包含/除外するライトを指定します。
これによって決まる包含/除外するライトは、lightmask
キーワード引数でパターンマッチングしたライト名よりも優先度が高いです。
例:
diff = diffuse(nml, "lightmask", "hero | fill");
詳細は、ライトカテゴリを参照してください。
"lightmask
",
string
="*"
lightとshadowのシェーダを評価する時、オブジェクトはライトマスクを事前定義します。 このマスクは、通常ではジオメトリオブジェクトで指定し、surfaceやfogのシェーダを照明するために使用するライトのリストを指定します。 “lightmask”引数を指定することで、デフォルトのライトマスクを上書きすることができます。
例:
diff = diffuse(nml, "lightmask", "light*,^light2");
…これは、名前が“light”で始まる“light2”以外のライトすべてが拡散反射光の照明で考慮されます。
すべてのHoudiniスコープのパターン(グループ展開を除く)がサポートされています:
-
*
- ワイルドカードに一致。 -
?
- 任意の1文字に一致。 -
^
- 一致するものを排除。 -
[list]
- 文字リストに一致。
光線オプション ¶
Tip
テクスチャを指定する時に例えばenvironment
キーワードと同様に、
画像フィルタリングキーワード引数を使用することもできます。
画像フィルタキーワード引数のリストは、environmentを参照してください。
"scope
",
string
光線に当たることができるオブジェクトのリスト。これを指定すると、scope
は、指定したraystyle
が選択されるようになっていたデフォルトのスコープを上書きします。
scope:default
値は、scope
引数が現在のコンテキストのデフォルトのスコープを使用するようにします。つまり、この引数を指定しなかった時の挙動になります。
光線の交差に対してスコープの上書きが可能になります。
特別なスコープ引数のscope:self
は、現在シェーディングされているオブジェクトにマッチします。
"currentobject
",
material
現行シェーディングオブジェクトがどれなのかを指定するために使用します。例えば、scope引数を使ったscope:self
は、この引数によって渡されたオブジェクトと同じ意味になります。
"maxdist
",
float
=-1
オブジェクトを検索する最大距離。これは、オブジェクトの検索を、その近くにあるオブジェクトだけに制限するために使います。指定したmaxdist
がマイナスなら、最大距離が指定されていないと見なされます。
交差をテストする時に光線が移動できる最大距離を上書きすることができます。 いくつかの関数(例えばfastshadow)には、(光線の長さによって)暗黙的に最大距離が定義されているものがあり、おそらくこのオプションを使用することができません。 しかし、反射、グローバルイルミネーション、屈折などの計算をする時には、このオプションを効果的に使用することができます。
"variancevar
",
string
分散アンチエイリアスで使用するVEXエクスポート変数の名前。レンダラーは、マイクロポリゴンレンダリングでこの値と隣接するマイクロポリゴンを比較し、さらにサンプルを必要とするシェーディングポイントを判断します(閾値としてvm_variance
propertyを使用)。もっとサンプルが必要なら、アルゴリズムは指定した最大光線サンプル数までサンプルを引き上げます。
この変数は、ヒットサーフェスからインポートされなければならないので、この変数はインポートする名前のリストになければなりません(以下の“光線から情報をインポートする”を参照)。名前を付けた変数がインポートされなければ、このオプションは無視されます。
分散アンチエイリアスは、高い分散値を持つ画像の領域内(例えば、シャープなシャドウエッジ)により多くのサンプルを配置します。これはvm_dorayvariance
が有効な時だけに使われます。そうでない場合は、最小光線サンプル(または明示的に指定したsamples
の値)のみがgatherループのアンチエイリアスで使われます。
グローバルのVarianceコントロール(Mantraの-vオプション)を上書きします。 このコントロールは、レイトレーシングのアンチエイリアス品質の決定に使用されます。 詳細は、Mantraのドキュメントを参照してください。
"angle
",
float
=0
分布角度(ラジアンで指定)。gather()に関しては、光線はこのアングル内で分布します。trace()に関しては、この角度は、交差距離が長くなるにつれてフィルタ幅が広がる速さを示すために使用されます。 角度が大きいほど、より遠くにあるヒットサーフェスほど、より大きい微分を使用するので、テクスチャリングとディスプレイスメントのパフォーマンスが良くなります。
効果を出すには、samplesパラメータも指定してください。
"samples
",
int|float
=1
フィルタ光線に送信されるサンプル数。イラディアンスとオクルージョンの関数に関しては、samplesパラメータを指定することで、デフォルトのイラディアンスサンプリングが上書きされます。
"environment
",
string
シーンに送信された光線がどこにも当たらなかった場合に評価される環境マップを指定することができます。
光線の方向を使用すると、指定した環境マップが評価されて、その結果のカラーが返されます。 ほとんどの場合、環境マップを評価するには、トランスフォーム空間を指定する必要があります。
refractlightとtraceの場合では、指定した背景カラーに関係なくOfとAfの変数に0が設定されます。
環境マップを指定する時、texture()のフィルタオプションにも対応しています。
環境/反射マップを作成する方法を参照してください。
"envobject
",
string
環境マップが使用されている場合、光線をシーン内の他のオブジェクト、ライトオブジェクト、フォグオブジェクトの空間に変換することで、その環境マップの向きを指定することができます。 Houdiniでは、Nullオブジェクトを使用して、その向きを指定することができます。例:
Cf = R*reflectlight(bias, max(R), "environment", "map.rat", "envobject", "null_object_name");
"envlight
",
string
環境マップが使用されている場合、光線をシーン内のライトの空間に変換することで、その環境マップの向きを指定することができます。
"envtint
",
vector
環境マップが使用されている場合、このカラーを使って環境マップに色味を付けます。
"background
",
vector
光線がどのオブジェクトにも当たらなかった場合、これをシーンの背景カラーとして使用します。 refractlightとtraceの場合では、指定した背景カラーに関係なくOfとAfの変数に0が設定されます。
"distribution
",
string
関数: irradiance, occlusion
イラディアンスの計算をするための分布。デフォルトでは、コサイン分布(ディフューズ照明)を使用します。
スタイルに指定可能な値は、均一なサンプリングをするnonweighted
、コサインウェイトのサンプリングをするcosine
です。
光線の送信オプション ¶
"width
",
float
=-1
光線のソースのフィルター幅を指定します。angle
も指定すれば、フィルターは光線に沿って距離が長くなるほど大きくなります。
デフォルトでは、フィルター幅は現在のシェーディングコンテキストから初期化されるので、通常では直接width
を指定する必要はありません。
マイナスの値は無視され、フィルター幅も現在のシェーディングコンテキストから初期化されます。
"distribution
",
string
="cosine"
サンプリング分布を決めます。
gatherの場合:
-
cosine
– 光線がcosine(diffuse)関数によって半球上に分布します。 -
uniform
– 光線が均一に半球上に分布します。
sample_geometryの場合:
-
area
– サンプルがプリミティブの面積によって分布します。 -
parametric
– サンプルがプリミティブのID、サブディビジョンのID、パラメトリックサーフェス座標(s,t)によって分布します。 -
solidangle
– サンプルがプリミティブの面積とプリミティブの立体角によって分布します。
"biasdir
",
vector
=Ng
Bias Along Normal が有効な時にバイアス方向を上書きします。
biasdir
を指定しなかった時は、ジオメトリの法線Ng
が使われます。
Bias Along Normal が無効な時は、このオプションは何の効果もありません。
"SID
",
int
=0
コールされたシェーダに渡すサンプルのID。 コールしているシェーダがサンプルの生成にSIDを使っていれば、指定したオフセットでサンプリングを始めることができるように、変更されたサンプルIDをコールされたシェーダに渡すことができるので役に立ちます。 この値はヒットサーフェスのSIDグループを初期化するために使われます。
"rayweight
",
float
=1
Mantraに最終的なシェーディングに対するこの光線の相対的な寄与度を示すためのヒント。 この値は光線の送信を制限するためのray clip閾値で使われます(ray bounceと同様)。
"raystyle
",
string
="refract"
送信している光線のタイプ。
Mantraはraystyle
を使って、光線を終了させるためのデフォルトのレイトレーシングマスクとバウンス制限の両方を決めます。
-
reflect
– 反射光線を送信します。Mantraは反射マスクと反射制限を使ってレイトレーシングを終了します。 -
refract
– (デフォルト)屈折光線を送信します。Mantraは屈折マスクと屈折制限を使ってレイトレーシングを終了します。 -
diffuse
– ディフューズ光線を送信します。Mantraはディフューズ光線に対してディフューズ制限を使います。 -
shadow
– シャドウ光線を送信します。Mantraはレイトレーシングレベルを変更せず、shadow/lightシェーダ内にshadowmask
があれば、それに対してトレースします。 -
primary
– プリマリ光線を送信します。この形式は、直接可視オブジェクトにだけ適用するレンダー設定の動作に影響を与えずに、シェーダがプライマリ光線の方向を変更する必要がある時(例えば、matteとphantom)に使うことができます。Mantraはプライマリ
光線を送信する時のレイトレーシングレベルを上げます。 -
nolimit
– 反射光線をレイトレーシングバウンスの数に制限なく送信します。Mantraはnolimit
光線を送信する時にレイトレーシングレベルを上げます。
"categories
",
string
光線が当たるオブジェクトを選択するために使用するカテゴリのエクスプレッション。
オブジェクトを指定すると、これは既存の Reflection Selection (reflectcategories
)と Refraction Selection (refractcategories
)パラメータを上書きします。
例えば、^hidden
は、hidden
カテゴリを持たないオブジェクトすべてに光線が当たります。shiny|happy
は、shiny
またはhappy
のどちらかのカテゴリを持つオブジェクトすべてに光線が当たります。
光線が当たるオブジェクトは、scope
とcategories
パラメータに共通するオブジェクトが選択されます。
"samplebase
",
float
=0
通常では、光線はシェーディングされるマイクロポリゴンのサーフェス上に分布します。 この引数は、領域を制御するために使われます。0の値は、強制的にすべての光線が同じポイントから送信されます。1の値は、全体のマイクロポリゴンを網羅します(Gatherのみ)。
"transparentsamples
",
int
=1
配列出力を持つ確率的透明度に対して取得する透明サンプルの数。通常では、配列変数内のエクスポートを要求しない限りは、この値には1を設定します。要求した場合、レイトレーサーは、光線に沿って各サンプルに対して配列にエントリーを挿入します。
Note
screendoor
またはsamplefilter
を使ってF
またはray:material
をインポートする時は、transparentsamples
が1でなければなりません。
ヒットサーフェスのシェーダに情報を送信する ¶
"send:name", value
の形式でキーワードを使えば、光線が発生したサーフェスのデータをその光線が交差したサーフェスに渡すことが可能です。これらの引数は、あなたが欲しい任意の値を渡します。
gather(P, dir, "send:N", normalize(N)) { ... }
rayimport関数を使えば、受け取り側(つまり、光線があたったサーフェス内)でこの渡されたデータを抽出することができます。1番目の引数が名前(send:
の接頭辞なし)で、2番目の引数はインポートした値を保存する変数です。
int rayimport(string name, <type> &value)
rayimport
は、値のインポートに成功すると1
を返します。
光線から情報をインポートする ¶
"varname", &var
の形式でヒットシェーダからインポートするグローバル変数またはエクスポート変数の名前を指定することができます。通常では、Cf
(当たったサーフェスのカラーベクトル)とOf
(当たったサーフェスの不透明度ベクトル)を含めます。
vector hitcf; gather(P, dir, "bias", 0.01, "Cf", hitcf) {...}
さらに、以下の特別なキーワードをインポートすれば、光線自体に関する情報を取得することができます:
"ray:origin
",
&vector
光線の原点(else
文節でも定義します)。
"ray:direction
",
&vector
光線の方向(else
文節でも定義します)。
"ray:length
",
&float
光線が最初に当たったサーフェスまでの距離。
"ray:area
",
&float
レイトレーシングスコープ内のジオメトリすべての合計のサーフェス面積。
"ray:solidangle
",
&float
レイトレーシングスコープ内のジオメトリすべてに対して評価された立体角。 光線の原点に近い、またはその原点を囲んだ大きいオブジェクトに対しては、非常に悪い評価になります。 個々のプリミティブに対しては、評価は非常に良くなります。
VEXの配列変数にデータを要求することで、光線に沿った2つ以上のヒットに関する情報を取得することも可能です。
インポートした値が配列タイプの時、trace関数が、レイトレーシング中に合成したヒットポイント毎に自動的に配列にエントリーを追加します。
opacity
サンプルフィルタ(以下参照)では、完全に不透明になるまでに遭遇した半透明サンプル毎に配列にエントリーが作成されます。
配列出力を使用する時、all
サンプルフィルタを使用するのも役に立ちます。これによって、不透明度の制限に関係なく、光線に沿ったヒットすべてが挿入されます。
// 可視性に関係なく、光線に沿ったヒットポイントすべてのポジションと法線を見つけます。 vector a_pos[]; vector a_nml[]; trace(P, dir, Time, "samplefilter", "all", "P", a_pos, "N", a_nml);
サンプルフィルタのオプション ¶
デフォルトでは、Houdiniは不透明度のブレンドを使ってグローバル変数を合成します。いくつかの場合では、一番近いサーフェスの値を取得するのに非常に役に立ちます(そのサーフェスが透明かどうかに関わらず)。
closest
やopacity
のどれかの文字列の値と一緒に特別なsamplefilter
キーワードを使えば、グローバル変数の値が一番近いサーフェスからの値かまたはブレンドした不透明度からの値かを制御することができます。
"samplefilter
",
string
samplefilter
キーワードが引数のリスト内にあると、以下の すべての インポート変数が指定したフィルタリングモードを使います。
単一のgatherステートメント内に複数のsamplefilter
引数を指定すれば、別々の変数を別々の方法でフィルタリングすることができます。
samplefilter
で可能な現行タイプ
minimum
すべてのサンプルの最小値を受け取ります。タプル値の場合は、各コンポーネントの最小値が使われます。
maximum
すべてのサンプルの最大値を受け取ります。タプル値の場合は、各コンポーネントの最大値が使われます。
opacity
Over演算を使ってサンプルを合成します。
closest
これがデフォルトの挙動で、一番近いサーフェスだけを返します。
screendoor
サンプルの確率的な合成を使用します。
sum
すべてのサンプルの値の合計を返します。
sum_square
すべてのサンプルの値の2乗の合計を返します。
sum_reciprocal
各サンプルの逆数の合計を返します。
Note
sample_geometryを使う時、不透明度のブレンドはデータを光線に沿って合成する時だけに動作するので、デフォルトのsamplefilter
はデフォルトでclosest
に設定されています。
gather(P, dir, "samplefilter", "opacity", "Cf", hitCf, "Of", hitOf, "samplefilter", "closest", "P", hitP, "N", hitN) { trace(pos, dir, time, // 確率的な透明度を使用してヒットサーフェスのBSDFを合成します。 "samplefilter", "screendoor", "F", hitF, // しかし、一番近いサンプルの位置を検索します。 "samplefilter", "closest", "P", hitP); }
パイプラインオプション ¶
"pipeline
",
string
変数を指定する時、変数の間にpipeline
キーワードオプションを挟むことで、読み/書き変数に値を満たすパイプラインの場所を制御することができます。
その値は、surface
、atmosphere
、displacement
のどれかを指定することができます。pipeline
オプションは何回も指定することができます。
このオプションを使用する度に、そのオプションの後に指定した変数(次のpipeline
までの変数)が影響を受けます。
gather(p, d, "pipeline", "surface", "Cf", surfCf, "pipeline", "atmosphere" "Cf", fogCf, "P", hitP)
Examples ¶
このサンプルでは、gather
を通じて伝達する2つのシェーダがあります。
このシェーダは光線をシーンに送信します。exportvalue
とラベルが付いたメッセージに0.8
を送信します。光線で当たったサーフェスは、amp
という名前でエクスポートされるパラメータを持たない場合があるので、gatherループの前に、この変数を初期化しておくことが重要です。
surface sendray(vector background=0; int nsamples=16) { float amp; amp = 0; Cf = 0; gather(P, N, "bias", 0.01, "angle", radians(15), "samples", nsamples, "samplebase", 1, "distribution", "cosine", "send:exportvalue", 0.8, "amp", amp) { Cf += amp; amp = 0; } else { Cf += background; } Cf *= 1.0 / nsamples; Of = 1; }
以下のシェーダは、gatherループでサーフェスに送信された値をインポートします。エクスポートされたパラメータは、gatherループでインポートすることができます。
surface hitsurf(export float amp=1) { float sendvalue = 0; if (!rayimport("exportvalue", sendvalue)) printf("Error importing the send:exportvalue\n"); amp = sendvalue; Cf = 1; Of = 1; }
See also |