MMD on WebGL シェーダーが大体完成

輪郭がちゃんと付くようになった。

一昨日は悲惨だったこのアングルも…

ちゃんとできてる。

どうしても輪郭線がうまく行かなくて MMDAgent のソースを見てみると、

  1. 普通に頂点をレンダリングし、
  2. 次に Cull Face でオモテ面をバッサリ切って、
  3. 輪郭線のある頂点を法線のほうに少し引き伸ばして
  4. 再度裏面だけ黒でレンダリングする

というようなことをしてた。

一度この方法でやったこともあったんだけど、その時は線が太くなりすぎて諦めてた。太くなったり汚くなったりするのはシェーダーの微妙な違いによるものだったので、今回はたまたまうまく行った。(vec4 の w 要素を normalize の前に消すか消さないかとかそういう程度)

最終的にはだいたいこんな感じ。

    // vertex shader
    if (uEdge) {
      vec4 pos = uPMatrix * uMVMatrix * vec4(aVertexPosition, 1.0);
      vec4 pos2 = uPMatrix * uMVMatrix * vec4(aVertexPosition + aVertexNormal, 1.0);
      vec4 norm = normalize(pos2 - pos);
      gl_Position = pos + norm * uEdgeThickness * pos.w; // scale by pos.w to prevent becoming thicker when zoomed
    }

この pos.w というのは MMDAgent にはついてないんだけど、これを付けることによってズームしても輪郭が太くならない効果があり、より MMD に近くなる。


MMD でも同じような方法で輪郭を付けてるというのが、この角度で輪郭線がちょっと浮いてしまってることからわかる。

ただ、これだけだとスカートや服の裏地が黒くならないので、gl_FrontFace で判定して裏面のときも輪郭線の色で塗ってある。

同じ事を MMDAgent でもやってると思うんだけど、その部分のコードがどこに相当するのか分からなかった。

とりあえず今日はここまで。ソースコードも公開した。

次は、Lat 式を表示するのはちょっと置いといて、地面の影とセルフシャドウに挑戦しようかな。