画質設定を追加してLive2Dのテクスチャサイズを変更したい

16 views
Skip to first unread message

nunu

unread,
Jun 13, 2024, 4:06:33 AMJun 13
to 宴ユーザーグループ
・宴のバージョン:4.0.7
・Unityのバージョン:2022.3.21f1
・OSバージョン:Windows11
・Unityの習熟度:宴のSendMessageは使えます

要望ではなく、「解決方法に心当たりがあればご助言いただけたら嬉しい」くらいの温度感の質問です。
他の方の投稿を優先いただいて構いません……!


前提として、コンフィグに独自の「画質設定」を追加しました。
QualitySettings.SetQualityLevelで変更し、その値を宴のシステム変数にも記録しています。

宴のシステム変数での分岐などを利用して、「画質設定に応じてLive2Dのテクスチャサイズを変更」できないかと考えております。
例えば、通常画質時はLive2Dは4096×4096サイズのテクスチャを使用し、低画質時は2048×2048サイズに自動で切り替える……というイメージです。

下記のような実装方法を考えたのですが、何分素人知識なものでどれも最良とは言い難いのが現状です。
より良い解決方法にお心当たりがあれば、お知恵をお借りしたいです。
------------------------------
■現時点での実装案
①テクスチャのサイズが違うLive2Dプレハブを複数用意し、Conditonalで出し分ける
 ⇒懸念:下記マニュアルに「Conditionalは条件の成否にかかわらず画像を全てロードしてしまう」とあるので、サイズ違いのモデルを全部読み込んでしまって意味がないのでは……?
https://madnesslabo.net/utage/?page_id=4268#i-17
 ⇒デメリット:Live2Dモデルをアップデートした時、サイズ違いのモデルも再インポート作業が必要となり、管理の手間が増える

②テクスチャ描き込みを使い、Conditonalで低画質時のみ「RenderTextureScale=0.5」にする
 ⇒デメリット:画質が悪くなりすぎてしまう

③プログラムから、宴のシステム変数でif分岐させてLive2Dのテクスチャを動的に変更する(これはまだ試していません)
 ⇒懸念1:元々設定されていたテクスチャを読み込んでLive2Dを表示→プログラムからテクスチャが変更される流れになるので、①と同じく要らないテクスチャを読み込んでしまうのでは……?
 ⇒懸念2:自力では「Live2Dが表示される度にプログラムが走る」ような実装になりそうなため、ロード時間増加やフレーム落ちが心配

④テクスチャ圧縮形式を変えてそもそもの容量を下げる
 ⇒懸念:Formatを変えて圧縮すると、グラデーションなどが潰れて汚い見た目になってしまうため採用は難しい
 ⇒デメリット:MaxSizeでの出し分けだと、「PCだがスペックが低い」「iOSだが最新端末のため高画質でも平気」な場合に対応できない
------------------------------

もし実用的な解決策が見つかりましたら、「画質設定」をプラグインとして配布することも検討したいと思っております。

お手数をおかけしますが、よろしくお願いいたします。

マッドネスラボ

unread,
Jun 13, 2024, 9:20:18 AMJun 13
to 宴ユーザーグループ
最適化はかなり難しい問題で、プロジェクト次第で何を優先するかなどによって解決策が違うので何とも言えないのですが、

参考までに UnityのQualitySettingsについて

Texture Quality(Unity2022ではGlobal Mipmap Limit?)を設定すれば、Mipmapのあるテクスチャの解像度を半分にしたりできるようなのでこれを使うのが良いかもしれません。
ただ、Mipmapはそもそも3Dゲームで遠方にあるモデルは低解像度のテクスチャで描画するために、低解像度用のテクスチャを何パターンかあらかじめ生成しておく・・・という手法なので、Live2Dのような場合はオフになっているかもしれません。
Mipmapがあると、低解像度のテクスチャも同時に作成されて使用サイズが増えるので、宴の通常テクスチャではオフにしています。
Scenario Data BuilderのCustom Import Foldersの部分で、インポート設定を変えています。(Live2Dモデルのプレハブだけではなく、テクスチャも宴プロジェクトのResourcesフォルダ以下に置いてると影響を受けてるかもしれません)

それ以外での宴としての結論は、やるとすればファイルロードを拡張して、QualitySettigs次第でロードするプレハブを変えるような処理をする必要があります。
スマホゲームとかでは、たぶんこのようなときにダウンロードする素材自体を変えているのだと思います。

>例えば、通常画質時はLive2Dは4096×4096サイズのテクスチャを使用し、低画質時は2048×2048サイズに自動で切り替える……というイメージです。
テクスチャのサイズを低解像度に変える場合、影響があるのはロードするファイルサイズや消費メモリが少なくなるという点です。
ロード時間が短くなったり、低容量なメインメモリのハードウェアでも動かせるということになります。
Unityが基本として用意しているの対応方法は④ですが、ご指摘の通りプラットフォームごとの設定しかできません。
ただ、この点では、①ではご指摘の通り宴のConditonalでは全部ロードしてしまっているので、むしろ逆効果になります。
③の手法はLive2Dがテクスチャの切り替え的なものがあったか、ちょっと私が覚えてないのですが、
できるとしても、負荷的な意味では多重化するので厳しそうです。一度基本的な高解像度のものをロードしてしまってから低解像をロードして、高解像度の未使用テクスチャにアンロードをかける・・・という流れが必要になります。

ただ、そもそもの問題として、テクスチャを低解像度に変えるというのは、ファイルロード時間や消費メモリ的には効果が大きいのですが、描画負荷的にはあまり意味がないこともあります。
描画負荷に大きく影響するのは、描画先の解像度(画面サイズ)や、Live2D等の各オブジェクトの描画手法自体、
描画するオブジェクトの大きさ(特に半透明な描画をたくさん重ねていないかなど:パーティクルを多用していると結構なりやすいです)
この点では、②が効果を発揮することがありますが、そもそもテクスチャ書き込みしてからもう一度そのテクスチャを描画するというのは、描画負荷が高い処理でもあります。
QualitySettingsが影響するのはここでいう「各オブジェクトの描画手法」の内部的なものが多いのですが、基本的には3Dモデル向けの設定が多いので、影響が少ないかもしれません。


2024年6月13日木曜日 17:06:33 UTC+9 nunu:

マッドネスラボ

unread,
Jun 13, 2024, 9:24:48 AMJun 13
to 宴ユーザーグループ
MipmapのオンオフはTextureのインポート設定のGenerateMipMapsになります。
オンオフの前後で、使用サイズが変わる点に注意してください
ss_0353.png

2024年6月13日木曜日 22:20:18 UTC+9 マッドネスラボ:

nunu

unread,
Jun 14, 2024, 4:18:26 PMJun 14
to 宴ユーザーグループ
ご回答ありがとうございます。
想像以上に詳細なご説明をいただき大変恐れ入ります……!

Live2DのテクスチャにMipmapを設定することで、イメージ通りの実装ができそうです。
Mipmapによる容量の増加はさほど問題ではないので、この方法で実装してみようかと思います!

2024年6月13日木曜日 22:24:48 UTC+9 マッドネスラボ:
Reply all
Reply to author
Forward
0 new messages