void split_bsdf(bsdf &lobes[], bsdf source, float &weights[])
void split_bsdf(bsdf &lobes[], bsdf source, float &weights[], int mask)
void split_bsdf(bsdf &lobes[], bsdf source, float &weights[], int mask, int type)
void split_bsdf(bsdf &lobes[], bsdf source, float &weights[], int mask, int type, float u)
void split_bsdf(bsdf &lobes[], bsdf source, float &weights[], int mask, int type, float u, float cdf[])
&lobes
この関数は、コンポーネントローブ別にBSDFでこの配列を上書きします。
source
分割するBSDF。
weights
この関数は、分割されたローブのウェイトでこの配列(戻り値のbsdf
配列と同じ長さ)を埋めます。
戻り値のローブを使ってサンプリングされた照明は、これらのウェイトでスケールする必要があります。
mask
評価するバウンスタイプを示したビットマスク。
コンポーネントラベルビットマスクの詳細は、bouncemaskを参照してください。
type
ローブの分割方法。#import "pbr.h"
によって、異なる分割タイプを意味した定数値を取得することができます:
-
PBR_SPLIT_FULL = 0
-
PBR_SPLIT_RANDOM = 1
-
PBR_SPLIT_ALBEDO = 2
-
PBR_SPLIT_COMPONENT = 3
-
PBR_SPLIT_DEFAULT = PBR_SPLIT_ALBEDO
u
CDFをサンプリングするランダム値。
cdf
BSDFのコンポーネント間でサンプリングを制御するために使用するCDF。
Returns
ローブを表現したbsdf
オブジェクトの配列。
Examples ¶
// BSDFをコンポーネントローブ(分布領域)に分割します。 bsdf lobes[]; split_bsdf(lobes, hitF, weights); // ローブのアルベドを取得します。 float albedos[]; resize(albedos, len(lobes)); for (int i = 0; i < len(lobes); i++) { albedos[i] = luminance(albedo(lobes[i], -hitnI)) * weights[i]; } // CDFを計算します。 float cdf[] = compute_cdf(albedos); // アルベド分布に基づいてBSDFをランダムに選択します。 int index = 0; sample_cdf(cdf, s.x, index); // 選択したBSDFを使って何かをします。 // lobes[index] ...
See also | |
bsdf |
|
pbr |
|
sampling |