- MMDのライティングよくわかんない。
古雑誌をゴミ出ししようとしたところ、Windows100%が出てきました。
つくもたんMMDモデルが付いてるやつです。
未開封だったため、とりあえずパンツだけは見なければと思い
昔自作したローダに突っ込んでみました。
思いっきり表示がおかしいです。
直せるだけ直すかと思い、いくらか調べたので書き記しておこうと思います。
まずは自作プログラムと一番差が出るSpecularから。
MMDのSpecular計算は次の様になっています。
1 | float4 Specula = pow(max(0,dot(normalize(N),normalize(-LightDir.xyz + normalize(Eye)))),SpcColor.w); |
---|---|
2 | Specula *- SpcColor; |
3 | Specula.w = 0.0f; |
ポイントは、視線・光線・法線ベクトルを使って反射率を計算している箇所です。
1 | dot(normalize(N), normalize(-LightDir.xyz + normalize(Eye))) |
---|
自作プログラムは次のように計算していました。
1 | dot(normalize(-Eye), normalize(reflect(LightDir, normalize(N)))) |
---|
現実のモデルを考えると自作プログラムの方の処理になったのですが、
MMDの方はなにやらよく解らない計算をしています。
そこで調べたのですが、これはBlinn-Phongという計算式で、
reflectの計算が重い処理系において、簡単に処理するもののようです。
MMDはあまりマシンパワーが必要ないように作っているようなので、
こういった簡略化の処理になっているのではないでしょうか。
しかしreflectはそんなに重い処理なのでしょうか。
MSDNを見ると、内部で「v = i - 2 * n * dot(i?n) 」という計算をしているだけのようです。
あと、計算結果の数値もわりと差が出る気がします。
アンビエントの方ですかね。あとディフーズが効き過ぎみたい。