もきもき3D

アクセスカウンタ

zoom RSS LW標準Specularの再現その後('A`)

<<   作成日時 : 2009/06/27 19:24   >>

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

LW標準のSpecular自体はBlinn-Phongモデルとして問題なし。
 spec = dot(N,H);

Glossによる減衰効果として
 sa->roughness == 1 / pow(2,(gloss * 10)+2); // roughnessはShaderAcccessで取れるパラメータ。
 power == 1 / sa->roughness;
 power == pow(2,(gloss * 10)+2); // glossiness値から直接powerを作るなら余計な逆数化は不要。
 spec = pow(spec, power);

んで、LW標準ではGlossによって減衰とは別にエネルギー保存の様な増幅効果が掛かる。
でも、式は公開されてないし、YahooGroupの過去ログを漁ってみても話題はあれど答えは無い状態('A`)

色々試してる中で結構似た結果を出す式をメモ。
 glossはノードなら直接代入、Shaderプラグインなら逆算。
   gloss = -(log2(sa->roughness) + 2) * 0.1; // sa->roughnessから
   gloss = (log2(power) - 2) * 0.1; // powerから
 A = pow(1.485, (gloss * 10) + 2) * 0.04; // ==pow()/25
 B = exp(gloss - 0.2) * 0.25; // ==exp()/4
 C = 1.5057696818180402;
 spec = spec * pow(A, B) * C;

Cはgloss0.2の時にspec==1になるようにする為の辻褄あわせ。
Bのgloss==0.2の時のABで
 C = 1 / pow(A, B); // == 1 / pow(pow(1.485, 4)*0.04, 0.25) == 1.5057696818180402

 妙にコストが高い気がする。
 Aの/25やBの/4を乗算に転換出来ない半端な値に刻めばもうちょい近似した結果になるかもしれないけどやってられねぇ('A`)

 基準になる要素(gloss値)が0の時の解が0.2の時の0.917xxx倍で、0.2と1.0の解が2.684xxx倍の関係になる曲線を出す簡素な式無いっすかね('A`)

 てか、誰か本当の式を知ってる人居ないっすか('A`)
 DStorm経由でNewtekに聞いたら教えて貰えるかなぁ。 聞けるか、答えが貰えるか、の二つの壁があるけど('A`)
 Phongノードの減衰式も知りたいんだよなぁ('A`)('A`)

----
 微小な誤差にまで詰められたから↑をちょろっと書き換えた(06/28)
 実験コードから書き写し間違えてたから修正&補足(w

テーマ

注目テーマ 一覧


月別リンク

ブログ気持玉

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

トラックバック(0件)

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

トラックバック用URL help


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

タイトル
本 文

コメント(0件)

内 容 ニックネーム/日時

コメントする help

ニックネーム
本 文
LW標準Specularの再現その後('A`) もきもき3D/BIGLOBEウェブリブログ
文字サイズ:       閉じる