FaceRigのLive2D Cubism3の描画について調べてみた

Cubism3でFaceRigデータをつくるとトラブル続出するという噂を聞いて
表示周りではどんな問題が残っているのか、Aviutlのプラグインを作るのにあたって用意したRendererテストモデルを使って調べてみた。

---

#モデルの形状とそのテスト目的

---

![2018-06-18_23h26_38.png](https://qiita-image-store.s3.amazonaws.com/0/117475/b451a2cc-a98f-cba6-84dc-609fdd294e01.png)

---

![2018-06-18_23h26_38_data.png](https://qiita-image-store.s3.amazonaws.com/0/117475/ef32a508-266b-b6af-4a72-1e99c5e2d75c.png)
#####A:マスクのカリング
マスクを作成するときに前のArtMeshのかリング形状を参照してしまうバグをチェックできる。

---

![2018-06-18_23h26_38_data1.png](https://qiita-image-store.s3.amazonaws.com/0/117475/bf3d944c-aed1-a759-ddcb-114ea5b85bed.png)
#####B:キーロストによるマスキング
![2018-06-20_23h17_50.png](https://qiita-image-store.s3.amazonaws.com/0/117475/3e00431c-2574-62ee-018a-271a5fb3b13d.png)
こんな感じのキーが無いパラメータ領域で表示が消えるArtMeshをマスクに割り当ててるときに最終の計算結果を参照してマスク生成してしまう。（エディタ的には適正だけどリファレンス的にはバグ

---

![2018-06-18_23h26_38_data2.png](https://qiita-image-store.s3.amazonaws.com/0/117475/851ce37f-406d-c8a3-0b28-87ebaa000dd4.png)
#####C:テクスチャの切り替え
マスク生成のときにテクスチャの切り替えを忘れていると表示が乱れる

---
![2018-06-18_23h26_38_data3.png](https://qiita-image-store.s3.amazonaws.com/0/117475/9b25e204-46ad-6a1f-f728-98949129ec16.png)
#####D:描画順ソート項目のチェック
ややこしいことにRenderOrderとDrawOrderという項目があり間違えると双方変化する
正しいと1番だけ変化する
パーツフォルダのグループ化で内部のソート番号はフォルダの値を見るのに
正しくない方の値はArtMesh描画順を見ているために問題が発生する

---
![2018-06-18_23h26_38_data4.png](https://qiita-image-store.s3.amazonaws.com/0/117475/baa8cb55-26ce-bdda-489a-557de37d6d43.png)
#####E:複数のキーロスト
キーロストの複数版

---

![2018-06-18_23h26_38_data5.png](https://qiita-image-store.s3.amazonaws.com/0/117475/c43136c7-60dc-4637-d95c-5fd0d74e2e9f.png)
#####F:半透明マスク
アルファ値で生成するのが正しいマスク生成なのだけど、
ステンシルバッファでマスクしていると真ん中の重なった部分がわからなくなる。
不透明度を0にしてそこのテストもしておきたい（忘れてた

---

![2018-06-18_23h26_38_data6.png](https://qiita-image-store.s3.amazonaws.com/0/117475/7782b84d-c645-e851-fc68-94f1d2b71649.png)
#####G:マスクの非出力
出力時に非表示になっているとマスクの指定番号が-１になって
対策をしていないと不正アクセスでアプリが死ぬ

---

#####H:背景に対する描画各種
![2018-06-18_23h26_38_data7.png](https://qiita-image-store.s3.amazonaws.com/0/117475/5558c180-d0b5-32dc-eb67-fb1338d53b3b.png)
背景に対して、通常（不透明度操作）、通常、加算、乗算の描画を行う。
アルファ値が0の背景に描画すると加算、乗算は描画先の透明度を引き継ぐので消えてなくなることになる。
なんかしらのバッファを介していると起こる。

---

#####I:色合成、加算乗算
![2018-06-18_23h26_38_data8.png](https://qiita-image-store.s3.amazonaws.com/0/117475/597b4d37-b8a2-f35b-8996-ef3763af2ede.png)
加算乗算での透明度の計算方式を確認する。
上の段が通常描画で下の段が加算や乗算。
グラデーションの進み方が一致するのが正しい表示。
間違ってると黒背景内や白背景内でズレる。

---

#FaceRigでテストしてみる

---
Cubism3（2018/06/21テスト）
![c3face.gif](https://qiita-image-store.s3.amazonaws.com/0/117475/0f8fe5ce-4144-eb60-6dd7-a985a044844e.gif)

---
ちょっと解像度の低いGifですがいろいろ問題が確認できますね。
-1,Aマスクのカリングは間違っているようです。
-2,Hどこかでバッファは経由してるみたいですね
-3,Iあと加算合成に問題があるようです
FaceRigのCubism3はもともと[CubismNativeComponents(Github)](https://github.com/Live2D/CubismNativeComponents)を参考にして作成したと言われていて
１，３の問題は4/20のコミットの時点はCNCでも残っていていました。**現在の最新コミットではなおっています。**
本当にCNCから作成している場合は更新を適用したらいろいろ治りそうですね
4/20の時点ではCのテクスチャでも問題が起きたはずなのでここだけ直されてる形ですね。
２の問題はもともとバッファを経由するシステムみたいでどうしようもないみたいです

---
Cubism2.1コンバート（同2018/06/21テスト）
![c2face.gif](https://qiita-image-store.s3.amazonaws.com/0/117475/c548f2ff-163b-7a1e-93f8-f52ff0951814.gif)

---
Cubism2.1にモデルを加工して突っ込んでみました。
-1,D描画順グループが解除されていますがCubism3の機能なので仕方ありません。
-2,Fマスクはステンシルバッファを使用しているみたいです。
-3,G存在しないマスクはマスクの情報自体が削除扱いになってクリッピングが解除されるようです。
Cubism2.1ではレンダリング部分までSDKに含まれて内部が見えないため
こちらは特性としてしょうがないところもあります。
まず目につくのは２のステンシルバッファを使用している点でしょうか
薄いマスクを掛けたいときはこの機能がつかえません。
余談ですがCubism2.1Editorでこのモデルを見るとIの色合いのところは加算がずれます。

---
#Cubism3モデルがめちゃくちゃ大きくなる問題について

---
出力時にPixelsPerUnitという値を設定しますが、FaceRigはこの値を考慮せず、もともとの頂点情報で描画しているみたいです。
詳しくはLive2D SDKマニュアルの[このあたりを参照](http://docs.live2d.com/cubism-sdk-manual/drawablevertexposition-checking/)

---
#トラブル回避
---
##マスク時の前カリング設定問題
マスク指定のときに前のカリング設定をもらってきてしまう問題
描画順をコントロールすることで直前に好きなArtMeshを持ってこれるので
余計な設定を引き継ぐ前に当たり判定などを差し込んで設定を意図的に持っていってもらう回避方法がある。
**よくわからないときはカリング自体を使わないのが一番安全**

---
##加算の色合いがおかしい問題
明るめのところから更に加算時には難しいですが
アルファ値で代用できるケースもあります。
ペイントソフトで乗算の色合いと透明度の色合いを並べて変色させて適用させます。

**これもよくわからないときは加算を使わないのが一番安全**

---

反応あったら追記とかするかも