【HLSL】VRoid Studioのモデルをアニメ塗りにする


UnityのHLSLを勉強する目的でアニメ塗りを試してみます。

やることは光源と法線を無視してベタ塗りして、輪郭線を付けるだけです。

 

以前に使ったVRoidのデフォルトキャラクターの1人を取り込んで使います。

後々わかったのですが透過部分が多くてテクスチャ自体に陰影があるので、今回の目的とモデルはちょっと合ってないです。

ベタ塗りにする

アニメ塗りなので表面ベクトルとか光なんか無視してベタ塗りにしてみる。

 

実際に適応してみる。

Vitaというオブジェクトの子孫オブジェクトのコンポーネントを取得してシェーダーを1つ1つ置き換えます。

余談ですが、VS CodeでC# (.csharp .cs)ファイルがフォーマットできなかったので、こちらの記事を参考にしました。

あんまり改行させたくないので Omnisharp.json は NewLine~ を全部 false にしたり適当に弄ったりして設定完了。

デフォルトシェーダー
カスタムシェーダー

いけた、と思いきやなんか目の周りが白いような。

髪を消してアップで見てみます。

なんかテクスチャが設定されていない。いろんな角度で見た時に自然に見えるようにこうしてるんだろうか。

 

アルファ値を 1 で固定してみるとこうなる。透明になってるだけです。

服はワンピースを透過させてたんですね。

 

裏側の色が見えればいいかと Cull Off にしてみたりしてもちょっと違う。

服の裏側や腕のリングの裏を描画するためにこれは採用。

 

色々と試したところ、AlphaToMask On を追加すると上手くいった。

Alpha to coverageといってアルファ値をアンチエイリアスに使うとか。

上手くいきました。

アウトラインを引く

これは色々方法があるようです。

Stencilを使う方法がうまくいかなかったので、一番単純な方法でやって見ます。

 

まず対象オブジェクトを法線方向に膨らませて、Cull Front でカメラ始点と反対側(物体の裏側)だけを黒く塗ります。

その後、通常の描画を行うことでアウトラインを作ります。

 

それっぽいですが口元などがおかしいです。

視点方向にしか膨らまないのに、なんでこうなるんだろう。

たぶん顔の曲率よりも膨らみが大きかったんだと思います。

 

重要と書いた部分を変更してみます。

まずはアウトライン用オブジェクトを元座標からZ方向を下げてみる。

o.vertex = UnityObjectToClipPos(v.vertex + v.normal * 0.005f - float4(0,0,0.01f,0));

Z方向の移動なのでカメラ中央からずれるとアウトラインもずれるが、カメラをPerspective(透視投影)からOrthographic(平行投影)にすると直る。

 

透視投影のままZ軸をいじるには先ほどの式をちょっと変える。

o.vertex = UnityObjectToClipPos(v.vertex + v.normal * 0.005f) - float4(0,0,0.1f,0);

こうすると何故かシーン画面に黒いオブジェクトが出なくなるけど、カメラ映像はちゃんと映る。

 

ちょっと体が重なるようなポーズをとってみます。

重なった部分のアウトラインがが消えるので、 Z 方向の移動を 0.001f に変えたものも載せます。

大体できました。

あとは透過で作られている服のアウトラインをどうにかすればよさそうです。

アルファ値の微分でもすればいいのか。出来たら追記します。


コメントを残す

メールアドレスが公開されることはありません。