On this page |
シェーディングコンテキストは、たくさんの共通するアトリビュートを共有します。 各コンテキストは、レンダリングパイプラインの異なるステージを表現します。 displacementシェーディングが最初に実行され、その後にsurfaceシェーディング、そしてfog/atmosphereシェーダが実行されます。 surfaceとfogシェーディングの間で、lightとshadowのシェーダが照明を計算するために実行される場合があります。
Note
すべてのシェーダコンテキストで利用可能なすべての変数は、ワールド(カメラ)空間にあります。
オプションの交差スコープパラメータ ¶
光線を送信する時、光線と交差したオブジェクトのリストは、通常では“スコープ”で制限され、Houdiniで設定します。 例えば、反射光線を送信する時に、反射オブジェクトの反射マスクに一致するオブジェクトとの光線交差でテストされるオブジェクトを制限します。
以下の関数でテストするオブジェクトを上書きすることができます:
関数 |
デフォルトのライト/シャドウスコープ |
デフォルトのサーフェススコープ |
---|---|---|
ライトシャドウ |
オブジェクト反射 |
|
ライトシャドウ |
オブジェクト反射 |
|
ライトシャドウ |
オブジェクト反射 |
|
オブジェクト反射 |
オブジェクト反射 |
|
すべてのオブジェクト( |
すべてのオブジェクト( |
|
オブジェクト反射 |
オブジェクト反射 |
|
オブジェクト反射 |
オブジェクト反射 |
|
ライトシャドウ |
オブジェクト反射 |
例えば、
Cr = reflectlight(bias, max_contrib, "scope", "geo1,geo2");
これは、オブジェクトの“geo1”と“geo2”のみを反射でピックアップします。
すべてのHoudiniスコープのパターン(グループ展開を除く)がサポートされています:
-
*
- ワイルドカードに一致。 -
?
- 任意の1文字に一致。 -
^
- 一致するものを排除。 -
[list]
- 文字リストに一致。
空っぽの文字列は、スコープをなしに設定します。
例:
-
geo*
- “geo”で始まるオブジェクトすべてに一致します。 -
geo*,^geo2
- “geo”で始まるオブジェクトで“geo2”以外のオブジェクトに一致します。 -
leg*,arm[123]
- “leg”で始まるオブジェクトすべてと、“arm1”、“arm2”、“arm3”のオブジェクトに一致します。
L変数を設定する方法 ¶
ここでは、VEXがどのようにしてLightとShadowのコンテキスト内のL
(ライトの方向)の初期値を設定しているのか説明しています。
Houdiniには以下に説明する値が用意されていますが、L
を任意の値に設定することができます。
Houdiniでは、ライトは orthographic(正投影) または perspective(遠近法) の投影をすることができます。 orthographic(正投影)ライトは、平行な光線を持つ無限の長さ(または非常に長い)の光源を意味します。 perspective(遠近法)ライトは、放射状の光線を持つ点光源を意味します。
perspective lightシェーダが実行されると、VEXはLをP - Ps
に設定します。P
変数は光源の位置、Ps
変数はシェーディングされているサーフェスポイントの位置です。
一方で、orthographic lightシェーダは、光源から放射される各光線のLの方向が同じになるように初期化されます: L = Lz * dot(Lz, P - Ps);
Lz
変数は光源の正規化した“Z軸”(つまり、ライトの空間内のZ軸を下に向けた単位ベクトル)。
そのため、L変数のスケールは、光源の平面からシェーディングされているサーフェスポイントまでの正投影の距離です。
不透明度 vs. アルファ ¶
サーフェスシェーディングコンテキストでは、透明度を制御するOf
(不透明度)とAf
(アルファ)の変数が2つあり、それらの変数は関係していますが、別のことを意味しています。
Of
はMantraがサーフェスのカラーを計算する時のサーフェスの不透明度を意味します。
例えば、
Of = {1, 1, 1}
これは、背後にあるサーフェスを隠す完全に不透明なサーフェスにします。
Of = {0.5, 0.5, 0.5}
これは、半透明なサーフェスにします。
Of = {1, 0, 0}
これはサーフェスのRedコンポーネントが不透明になり、ライトのGreenとBlueのコンポーネントはサーフェスを通過します。 これは青緑色のジェルを作成します。
Af
はRGBA画像内の出力ピクセルのアルファチャンネルを制御します。
シェーダがAf
を設定しなかった場合、Mantraは以下のデフォルトの式を使用します。
Af = avg(Of)
しかし、この変数を明示的に設定すると、シェーダは出力画像のアルファチャンネルの値を制御することができます。 これによって、“matte”や“shadowmatte”のようなシェーダを記述することができます。
例えば、以下のシェーダは青のスクリーンエフェクトを模倣します:
surface bluescreen(vector clr=0) { Cf = clr; Of = 1; Af = 0; }
デフォルトのサーフェスカラーはブラック(vector clr=0
)です。シェーダは不透明度を1に設定します。つまり、このサーフェスは他のサーフェスを隠します。
しかし、このサーフェスに相当する出力画像のピクセルのアルファ値は0(完全に透明)になります。
他の画像の上に出力画像を合成するなら、背景画像はこのサーフェスが残した穴から見えます。このテクニックを使って、例えば、ジオメトリを修正しなくても壁に窓を作成することができます。
Af
を0から1の間の小数点の値に設定して、出力画像に半透明な領域を作成することができます。
Note
occlusion()
のデフォルトは、最近接サンプルフィルターを使用します。透明度を操作するには、その関数のオプションの“samplefilter”、“opacity”を使います。これは、 Ambient Occlusion モードの時には環境光アセットの Transparent Shadows トグルでも操作します。
特別な変数 ¶
シェーディングコンテキスト内のシェーダにパラメータとして追加可能な“特別な”変数がいくつかあります。 通常では、これらの変数は、エクスポートパラメータです。
__nondiffuse
この変数をゼロ以外の値に設定すると、lightシェーダが標準のdiffuse()関数内の拡散反射光照明に寄与しなくなります。
__nonspecular
この変数をゼロ以外の値に設定すると、lightシェーダが標準のphong()、blinn()、specular()の関数内のスペキュラー照明に寄与しなくなります。
__contrib_names
__contrib_amounts
エクスポートで操作されるContribution(寄与度)の文字列コンポーネント名の配列。このエクスポートは定数でなければなりません。
その理由は、Mantraがシェーダ実行前に名前を照会するからです。
__contrib_amounts
__contrib_names
配列で整列されたfloatの配列で、各コンポーネントに寄与するライトの量を指定します。
1.0の値は、完全な寄与度を意味し、0の値は、寄与しないことを意味します。
現在のところ、0と非ゼロの値のみがMantraで認識されます。つまり、それぞれがNo ContributionとFull Contributionであり、小数点値をサポートしていません。
このエクスポートは、定数でなければなりません。その理由は、Mantraがシェーダ実行前に量を照会するからです。
__nofog
この変数をゼロ以外の値に設定すると、fogシェーダがサーフェスカラーに影響を与えなくなります。
__illuminateangle
レンダラーへのlight/surfaceシェーダの照明の角度を示します。これは、ライトの方向から照明の円錐のエッジまでの角度です。角度はラジアンで指定し、定数式に評価します。例えば、角度はP
やs
/t
などの変化する値に依存することができません。