もきもき3D

アクセスカウンタ

zoom RSS OrenNayarのオチ(・з・)

<<   作成日時 : 2009/06/23 07:45   >>

ブログ気持玉 0 / トラックバック 0 / コメント 0

 LWのOrenNayar Nodeは当モデル式の計算コストの高いもの(Model for Gaussian Slope-Area Distribution)を使ってるぽい。
 RenderManを元にしてるっぽいソースを元にして式を組んだら、同じラフ値において結果はほぼ一致した。
 結果には微妙な差があるけど、整数のRGB値に落とし込む段階で消える程度の誤差なので、変数の型や処理時の精度の違いかもしれない。
 でもNodeでは形状外縁のエッジでゴミが出る可能性あり。
 (誤差が強い箇所の付近である。ライトの当らない箇所でもある。SpotにおいてN・Lが-になった時に出るゴミに似てる。etc。発生する条件は限定てされそうだけどね)

 Node自体は取りあえずはこんな感じか(・з・)

 簡易式(Qualitative Model)において変なトーンジャンプが出るのは、サブパッチの影響で法線が乱れるから、かも。
 四角ポリの球プリミティブをサブパッチ化するのを止め、生ポリ状態でレンダリングしたら変な紋はでなかった。
 MAX(0,)による−要素の切捨てをしようがしまいが生ポリでなら同一の結果になった。

----
 ウボァ('A`)甘かった
 外縁部の差異は誤差の範疇かと思ってたけど、ライトを増やしたら別の箇所での差異が顕著化して出てきた('A`)
 使用モデルが違うのか、どちらかの実装が間違ってるのか、どっちかわかんね('A`)

----
 一箇所±を間違えてた(;;・з・)
 これで一灯なら100%合致すると言える状態になったはず。
 が、ニ灯以上だと顕著に差異が('A`)
 さらに、どちらであっても外縁部にゴミピクセルが・・・('A`)
 うむぅ('A`)

----
 色々あったけど、本当のオチ・・・のはず(・з・)
 ライトの数とか計算量の低減とかを考えないベタな式。

rough == ラフさのパラメータ(0-1)。
N == スポットの法線ベクトル。
V == スポットから視点へ向かうベクトル。
 LWのNodeは視点からスポットへのベクトルなので符号反転する。算出する場合は normalize(raySouce - wPos)。
L == スポットからライトへ向かうベクトル(語弊有り)。
 LWで得られるのはライト側からスポットへ向かうベクトルなので符号反転する。
//

sigma = rough * rough;

NV = fmax(0, dot(N, V));
NL = fmax(0, dot(N, L));

Theta_I = acos(NV);
Theta_R = acos(NL);

AV = V - (N * NV); // 簡易表記(実処理はベクトルの各要素*スカラー値)
AL = L - (N * NL);
normalize(AV);
normalize(AL);
Phi = dot(NV, NL);

// 完全な同値の時どうすべきなのかは不明
if(isgreaterequal(Theta_I, Theta_R)){
A = Theta_I;
B = Theta_R;
}else{
A = Theta_R;
B = Theta_I;
}
// 大抵のサンプルはこうだけど、このケースだとLWのノード同様に球形状の外縁部にゴミが出る傾向がある気がする。
// A = fmax(Theta_I, Theta_R);
// B = fmin(Theta_I, Theta_R);

C1 = 1 - (0.5 * sigma / (sigma + 0.33));
if(Phi >=0){
C2 = (0.45 * sigma / (sigma + 0.09)) * sin(A);
}else{
C2 = (0.45 * sigma / (sigma + 0.09)) * (sin(A) - pow(2 * B / PI, 3));
}
C3 = 0.125 * (sigma / (sigma + 0.09)) * pow((4 * A * B) / (PI * PI), 2);

L1 = NL * (C1 + (Phi * C2 * tan(B)) + ( (1 - fabs(Phi)) * C3 * tan((A + B) * 0.5) ));
L2 = 0.17 * NL * (sigma / (sigma + 0.13)) * (1 - (Phi * pow(2 * B / PI, 2)) );
// L2 = 0.17 * NL * (sigma / (sigma + 0.13)) * (1 - (Phi * ((4.0 * B * B) / (PI * PI)) ) );

destColor += ((color * L1) + (color * color * L2)) * lightColor * diffuse;

テーマ

注目テーマ 一覧


月別リンク

ブログ気持玉

クリックして気持ちを伝えよう!
ログインしてクリックすれば、自分のブログへのリンクが付きます。
→ログインへ

トラックバック(0件)

タイトル (本文) ブログ名/日時

トラックバック用URL help


自分のブログにトラックバック記事作成(会員用) help

タイトル
本 文

コメント(0件)

内 容 ニックネーム/日時

コメントする help

ニックネーム
本 文
OrenNayarのオチ(・з・) もきもき3D/BIGLOBEウェブリブログ
文字サイズ:       閉じる