On this page |
概要 ¶
// この見出しの中に以下のIncludeが入らないように、これをインデントする必要があります。
illuminance(position, [axis], [angle], [light_typemask], [lightmask]) { // ここのClとLが現在の光源の値/方向に設定されます。 // 強制的にshadowシェーダをコールするために、以下の関数を使用します: // shadow(Cl); }
shadowシェーダは、明示的にコールしない限りコールされません。しかし、一度shadowシェーダをコールしてしまえば、surfaceシェーダがコールされている間はCl
の値が変わります。
ビルトインのライティングコール(例えば、diffuse、specular、ambient)のどれかを使うと、shadowシェーダが自動的にコールされます。
軸のデフォルト値は、サーフェス法線です。角度のデフォルト値は、PI/2です。light maskのデフォルト値は、LIGHT_DIFFUSE|LIGHT_SPECULAR(ライトの定義に関しては、shading.hを参照)です。
illuminance
ステートメントは、dot(L, axis) > cos(angle)
の光源すべてをループします。
ライトの包含/除外オプション ¶
"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]
- 文字リストに一致。
情報をライトのシェーダに送信する ¶
illuminance
に文字列/値のペアの引数を追加すれば、名前を付けた値を各ライトのシェーダに渡すことができます。例えば、N
変数の値をorgN
として渡すには、以下のように記述します:
illuminance (P, nf, M_PI/2, "orgN", N) { ... }
ライトのシェーダでは、simport関数によってilluminanceループから値を受け取ることができます。
vector orgN; simport("orgN", orgN);
simport
関数は、値をインポートできれば1を返し、そうでないなら0を返します。つまり、if
ステートメントの条件に、この関数を使うことができます。
以下に完全なサンプルを載せます:
surface exporter() { vector nf = frontface(normalize(N), I); Cf = 0; illuminance(P, nf, M_PI/2, "orgN", N) { Cf += Cl; } } light importer() { vector orgN; if (!simport("orgN", orgN)) orgN = N; // 元のNを使用します。 Cl = orgN; }
メッセージの受け渡し ¶
illuminanceループ内ではlimport関数によってlightシェーダから値を取得することができます。
lightシェーダは、simport関数によってilluminanceステートメントに渡された“キーワード”の引数を受け取ることができます。
例えば、vectorの変数uv
をlightシェーダに送信するには以下のように記述します。
vector uv = set(s, t, 0); illuminance(P, dir, "uv", uv) { ... }
lightシェーダは、以下の記述によって、uv
変数を読むことができます。
vector uv; if (simport("uv", uv)) printf("Imported: %g from surface\n", uv);
lightexportキーワード引数 ¶
追加文字列引数の"lightexport"
の後に、ループ内に割り当てるためのエクスポートされる変数の名前を含んだ文字列引数を指定することができます。
いくつかのシェーダでは、複数のilluminanceループを使って別々のライトの寄与度を定義することができます。
lightexport
引数は、異なるループからエクスポートする変数を指定するために、それらの場合で役に立ちます。
lightexport
の値は、スペース区切りのリストにワイルドカードのパターンを使うことができます。
例えば、illuminance(pos, dir, "lightexport", "Front*")
は、Front
で始まる名前の変数をエクスポートします。
surface light_export_test(export vector diff=0; export vector spec=0) { vector nn = normalize(frontface(N, I)); vector vv = -normalize(I); vector clr; Cf = 0; // このilluminanceループは、"diff"変数にのみエクスポートします。 illuminance(P, nn, "lightexport", "diff") { clr = Cl * diffuseBRDF(normalize(L), nn); Cf += clr; diff = clr; } // このilluminanceループは、"spec"変数にのみエクスポートします。 illuminance(P, nn, "lightexport", "spec") { clr = Cl * specularBRDF(normalize(L), nn, vv, 0.1); Cf += clr; spec = clr; } }
See also |