車軸さんによるVRCアバター軽量化指針

4
車軸制作所𝕏☸️VR法人HIKKY 所属🎶wazx vAa nafa h.m.m.r./. @shajiku_works

⚠️間違いあったらマサカリ投げて Unityでの描画負荷は、大雑把に言って[SetPassCall]と[FillRate]が影響します。 [SetPassCall]はGPUがまとめて描画する命令の呼び出し回数的なもの、 [FillRate]は画面内pixelの塗りつぶし率的なものです。 どちらも高いほどGPU負荷が高いです。 ➡️つづくよ!

2018-04-15 15:27:23
車軸制作所𝕏☸️VR法人HIKKY 所属🎶wazx vAa nafa h.m.m.r./. @shajiku_works

[SetPassCall]は、一般的に描画するMaterial数だけ呼ばれます。 なので「Material(と設定するTexture)をまとめる」ことで描画負荷を減らすことができます。 使用Materialが同一の場合、複数のMeshRendererが存在してもUnity側で自動的にSetPassCallがまとめられます。 しかし…… ➡️つづくよ!

2018-04-15 15:31:34
車軸制作所𝕏☸️VR法人HIKKY 所属🎶wazx vAa nafa h.m.m.r./. @shajiku_works

同一Materialを設定してもSetPassCallがまとめられない場合もあります。 例えば [各RendererのScaleが違う] [当該Mesh群の合計ポリゴン数が65535を超える] ときなどです。 Scaleが違うRendererは別でSetPassされ、バッチ後65535ポリゴンを超える場合は内部的に分割されSetPassされます ➡️つづくよ!

2018-04-15 15:34:59
車軸制作所𝕏☸️VR法人HIKKY 所属🎶wazx vAa nafa h.m.m.r./. @shajiku_works

それから、ボーンを設定している [SkinMeshRenderer]の場合は、それだけでも使用Material数分のSetPassCallがよばれます。 例えばアバター本体(ボーン入り)とメガネオブジェクト(ボーンなし)に同一のMaterialを設定しても、この場合はSetPassCallは2回呼ばれてしまいます。 ➡️つづくよ!

2018-04-15 15:37:14
車軸制作所𝕏☸️VR法人HIKKY 所属🎶wazx vAa nafa h.m.m.r./. @shajiku_works

[FillRate]は、画面内のpixel塗りつぶし率的なもので、例えば画面全体を一色で塗りつぶす場合、全ピクセルを1回ずつ塗れば最速で画面全体を更新できます。 でも、何度も何度も同じpixelを重ね塗りしまくっていたら、その分描画負荷がかかることになります。 ➡️つづくよ!

2018-04-15 15:39:13
車軸制作所𝕏☸️VR法人HIKKY 所属🎶wazx vAa nafa h.m.m.r./. @shajiku_works

透過処理をしない不透明でZバッファへの書き込みを行うShaderの場合、 「既に塗ったpixelより奥の位置にあるオブジェクトは描画する必要がないためスキップ」されます。 閉まっているドアを描いた後、その向こうの景色を描く必要はないからです。 ➡️つづくよ!

2018-04-15 15:41:35
車軸制作所𝕏☸️VR法人HIKKY 所属🎶wazx vAa nafa h.m.m.r./. @shajiku_works

もちろん描画順によっては、 「先に景色を描いてしまったから、その上からドアを塗り重ねる」 ことも起こり得ます。これはまぁしかたない。 透明描画をするShaderの場合、このFillRateが高くなりがちです。 ➡️つづくよ!

2018-04-15 15:45:22
車軸制作所𝕏☸️VR法人HIKKY 所属🎶wazx vAa nafa h.m.m.r./. @shajiku_works

アルファ抜きでステッカー等を描画する場合もFillRate上昇の懸念があります。 左の画像は1ポリゴンですが、透明部分が多くあります。この透明なpixelも「透明な色で」塗られてしまうわけです。 右の画像は49ポリゴンですが、透明部分は一切ないため、無駄な重ね塗りは発生しません。 ➡️つづくよ! pic.twitter.com/YplkMj2de1

2018-04-15 15:56:26
拡大
拡大
車軸制作所𝕏☸️VR法人HIKKY 所属🎶wazx vAa nafa h.m.m.r./. @shajiku_works

ポリゴンあたりの描画負荷とpixelあたりの描画負荷を実際に計測していないのでアレですが、大きくアルファ抜きするくらいならポリゴン増やして造形した方が軽いとはよく言われてますね。 ➡️そろそろおわりにしよう

2018-04-15 15:58:28
車軸制作所𝕏☸️VR法人HIKKY 所属🎶wazx vAa nafa h.m.m.r./. @shajiku_works

まとめると描画負荷を軽くするには ・Materialを可能な限りまとめる ・ただし半透明Shaderは必要な部分にのみ留める ※一部だけ半透明があるモデル全体に半透明Shaderを使うより、Material分けてでも不透明部分は不透明Shaderがいいと思う ざっくりこんなんです めっちゃ大雑把で申し訳ない おわりー

2018-04-15 16:02:37