もきもき3D

アクセスカウンタ

zoom RSS シェーダ('A`)

<<   作成日時 : 2009/06/04 20:14   >>

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

LW標準のスペキュラはPhong、SDKのサンプルはBlinn。

とあるOrenNayarシェーダプラグインはフェイクなOrenNayar+Blinnスペキュラ。
Roughness 0でもLambertに一致しない。
LWのOrenNayar Nodeの結果とも一致しない。

ちなみにLW SDK収録のスペキュラNodeのサンプルは上記作者が書いてる・・・。


プラグインのソースはあるからそれを元に正しい物を作れないか試したけれど、結局書き直し。
でもシェーディングへの理解不足から正しい(と思われる)結果が出せない体たらく('A`)
小細工してたりPixelシェーダに投げっぱなしなサンプルは見つかるけど、理解/分解復元できねぇ('A`)
まぁ、質感を他ソフトで再現しなきゃいけない様な状況では無く、使い捨てデータと割り切るならば、フェイクだろうがなんだろうがそれっぽく見えてれば良い事ではあるのだけれど('з`)

てか、9.xがしっかりしてればNodeを多用しても問題無いのになぁ(・з・)

----
あれ〜(・з・)Phongかと思ってたのに違かった(w
Phongにしたつもりでレンダしたした時に、NodeがOFFにでもなってたのかなぁ('A`)
かと言ってBlinnな訳でもなさげ(Nodeと標準での結果で似てるといえば似てるけど・・・)。

どんどんとわけわかんなくなっていく('A`)

----
取り合えず、LW標準スペキュラはBlinnであり、Specuarity * 0.91862+α0.9176470588235294117(234/255)倍したBlinn Nodeの結果に近い。
SurfaceColor、LightColorを全て1.0、Ambientを0.0、Glossinessを0.0にし、DistantLightで球形状を照らした場合、Nodeの結果はSpecularity値を常に上回る(倍率値をspec値とした時に0.92のピクセルが存在する等)。
他のライト種では未テスト。
ShaderPluginとして作ったBlinnモデルとBlinn Nodeの結果を比較したら、スペキュラが消失するぎりぎりの所で微妙な差があった(Differenceで重ねた時、目に見えて目立つ差は其処だけ)。
Nodeの方が切れがよい(消失が早い)。 切れのよさはLW標準も同じなので、基本的な部分は共通の処理をしてそう。
※計算時にmax(0, N・L)としてdot(N,L)の−成分を捨てれば多分一致する。

PhongはNodeの物と全然一致せず('A`) 球を対象にした時、Nodeの方が1.5倍程スペキュラの直径が大きい。
「Phongによるスペキュラ」の例が殆ど見つからないので傾向としてどちらが正解に近いのか謎('A`)
てか、自分の実装が間違えてる可能性が高い(;・з・)
反射ベクトルRの定義がwiki(en)と僅かに見つかるcodeの断片や説明と違ったり・・・。
その手の本に頼らないとダメかのぉ('A`)

メモ:
「Cook-Torrance Nodeは余計な所で0〜1でClampしてねぇ?」という話しがNewtekフォーラムにあった気がする('A`)

なんつぅか、確実に本末転倒な状態になってるから、いい加減に見切りをつけんとあかんな('A`)

----
ShaderAccess->roughnessは「pow(2, 2+(Glossiness * 10))」の逆数。
生の値としては0.25から始まり減っていく。
SDKの指標通りに逆数をジェーディング時のpowerとするなら、powerは4から始まり4096間の値になる。
観測して判った後で、Blinn nodeサンプル内でもそう書かれてて以下略('A`)
でも、Phong Nodeはその規則(伝統?)に沿ってないんじゃなかろうか。

----
Phong Nodeのpowerは、Gloss==0の時は1相当であり、減衰なしのPhongモデルの値そのまま、と。
Gloss !=0の場合の減衰式/規則が謎すぎる('A`)

Spec==1、Gloss==0、LightColor==1でのPhong Nodeの結果に対してLW標準のGloss効果が掛かるノードを組み、ShaderPluginとして書いたPhongモデルの結果と比較したら一致した。

SA->roughnessからGlossへの還元は
power = 1.0 / SA->roughness;
gloss = (log2(power) - 2.0) * 0.1;

Gloss 0.2の場合は 16 = 1 / 0.0625; log2(16) = 4; 0.2 = (4 - 2) * 0.1; となる。

----
スペキュラの喪失(0.9倍)はglossが0に近いと起こり、値が上がっていくと起こらない・・・むぅ('A`)

----
gloss0の時約-10%、gloss20の時に約0%になり、以降は+α%されていく感じか。
glossが上がると明るい点の面積が増えていく(・з・)
y1:x2の単純な比例??(;・з・)

----
gloss10%当り233.5/255(0.4156)で、gloss20%以降は比例から外れて緩やかに増加するっぽい('A`)
0〜20%間も微小な変化をしてるのかもしれんけど。
Blinnの結果*((1 - ((gloss - 0.2)*0.4156)) +1)でgloss0〜20%は大体合うけど、gloss50%の時は標準スペキュラの係数の方が高い(スペキュラの直径自体は同等だけど、グラデーション部は明るく、100%に達して飽和してる直径が大きい)。
ウーン('A`)

テーマ

関連テーマ 一覧


月別リンク

ブログ気持玉

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

トラックバック(0件)

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

トラックバック用URL help


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

タイトル
本 文

コメント(0件)

内 容 ニックネーム/日時

コメントする help

ニックネーム
本 文
シェーダ('A`) もきもき3D/BIGLOBEウェブリブログ
文字サイズ:       閉じる