| On this page | |
| Context(s) | displace fog light shadow surface | 
                
                    
                    
                    
                        int  sample_geometry(vector origin, vector sample, float time, ...)
                    
                    
                
            
VEXのsample_geometryオペレーションは、シーン内のジオメトリオブジェクト上に単一サンプルポイントを分布して、そのポイントでサーフェスシェーダを実行するために使われます。
このオペレーションは、オペレーションでエクスポートされるシェーダ出力の可変長引数のリストを受け入れるという点では、traceとgather関数と同じです。
しかし、sample_geometryは、シェーダを実行する場所を決めるために実際に光線をシーンに送信しないという点では、レイトレーシング関数と異なります。
‹origin›と‹sample›のパラメータは、分布のタイプによって意味が異なります。
‹time›は時間と空間内でサンプルポイントを分布するためにモーションブラーと一緒に使うことができます。
エリア分布 ¶
このモードでは、エリアに応じて複数のプリミティブ上にポイントが分布します。 小さなサーフェスエリアよりも大きなサーフェスエリアを持つプリミティブの方により多くのサンプルが配置されます。 ‹sample›パラメータには、0から1の範囲で均一にランダムな変数を含むべきです。 ‹origin›パラメータは何の影響もありません。
パラメトリック分布 ¶
このモードでは、パラメトリックサーフェス座標と一緒にプリミティブIDとサブディビジョンIDがサーフェスポジションにマップされます。 このモードは、サーフェスポジションをまとめたセット(例えば、ポイントクラウド)を複数のフレームに渡って保持しようとする時に役に立ちます。 なぜなら、メッシュが変形しても、同じプリミティブID、サブディビジョンID、sとtの座標は、同様のサーフェスポジションにマップしているからです。 ‹sample›パラメータにはsとtの座標を含めます(1番目と2番目のコンポーネント)。一方で、‹origin›パラメータには、プリミティブIDとサブディビジョンIDを含めます(同様に、1番目と2番目のコンポーネント)。
立体角分布 ¶
このモードは、“エリア”モードと似ていますが、特定のプリミティブ上のポイントはエリアではなく立体角に応じて分布します。 より具体的に言うと、サンプルは‹origin›を基準に半球状の領域に応じて分布します。‹sample›パラメータは、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 ¶
以下のサンプルでは、sample_geometryを使って、あるサーフェスを他のサーフェスから照明する方法を説明しています。
光源を使うのではなく、照明はシーン内の/obj/sphere_object*という名前の他のサーフェスからギャザリングされて、割り当てたgeolightサーフェスシェーダを使ってサーフェスを照明します。
シェーダに関するいくつかの見解:
- 
        
        ray:solidangle出力は、ヒットサーフェスに対する立体角によってジオメトリサンプル寄与度をスケールするために使われます。これは、sample_geometryを使った結果が、物理ベースのirradianceに一致することを保証します。
- 
        
        trace命令は、シャドウのために使われます。 
- 
        
        newsamplerとnextsampleの高品質サンプリングパターンは、アンチエイリアスのために使われます。 
surface geolight(int nsamples = 64) { vector sam; vector clr, pos; float angle, sx, sy; int sid; int i; sid = newsampler(); Cf = 0; for (i = 0; i < nsamples; i++) { nextsample(sid, sx, sy, "mode", "qstrat"); sam = set(sx, sy, 0.0); if (sample_geometry(P, sam, Time, "distribution", "solidangle", "scope", "/obj/sphere_object*", "ray:solidangle", angle, "P", pos, "Cf", clr)) { if (!trace(P, normalize(pos-P), Time, "scope", "/obj/sphere_object*", "maxdist", length(pos-P)-0.01)) { clr *= angle / (2*PI); clr *= max(dot(normalize(pos-P), normalize(N)), 0); } else clr = 0; } Cf += clr; } Cf /= nsamples; }
| See also | |
| light |  | 
| pbr |  | 
| rays | |
| sampling | |
| shading |  |