• MMDのSpecular計算

    2011年06月12日 13時53分
    前回までのあらすじ
    • MMDのライティングよくわかんない。


    古雑誌をゴミ出ししようとしたところ、Windows100%が出てきました。
    つくもたんMMDモデルが付いてるやつです。

    未開封だったため、とりあえずパンツだけは見なければと思い
    昔自作したローダに突っ込んでみました。


    つくもたん
    思いっきり表示がおかしいです。


    直せるだけ直すかと思い、いくらか調べたので書き記しておこうと思います。



    まずは自作プログラムと一番差が出るSpecularから。

    MMDのSpecular計算は次の様になっています。
    1float4 Specula = pow(max(0,dot(normalize(N),normalize(-LightDir.xyz + normalize(Eye)))),SpcColor.w);
    2Specula *- SpcColor;
    3Specula.w = 0.0f;


    ポイントは、視線・光線・法線ベクトルを使って反射率を計算している箇所です。
    1dot(normalize(N), normalize(-LightDir.xyz + normalize(Eye)))


    自作プログラムは次のように計算していました。
    1dot(normalize(-Eye), normalize(reflect(LightDir, normalize(N))))


    現実のモデルを考えると自作プログラムの方の処理になったのですが、
    MMDの方はなにやらよく解らない計算をしています。


    そこで調べたのですが、これはBlinn-Phongという計算式で、
    reflectの計算が重い処理系において、簡単に処理するもののようです。

    MMDはあまりマシンパワーが必要ないように作っているようなので、
    こういった簡略化の処理になっているのではないでしょうか。


    しかしreflectはそんなに重い処理なのでしょうか。
    MSDNを見ると、内部で「v = i - 2 * n * dot(i?n) 」という計算をしているだけのようです。
    あと、計算結果の数値もわりと差が出る気がします。
  • 裏面が真っ黒なのでアンビエントかエミッションあたりがあやっしい気がっ
    . 2011年06月18日 23時18分
  • MMDはエミッションなかった気がするので、
    アンビエントの方ですかね。あとディフーズが効き過ぎみたい。
    クロ 2011年06月19日 12時26分

コメントを書く

名前
本文
編集用パスワード 入力すると編集が行えます
管理者のみ閲覧