[URP?] Unity 2021.3.0f以上において、テクスチャの透明にしている部分が透明にならない。再現できなかった
環境情報
- UniVRM version:
0.97.0以上 - Unity version:
Unity-2021.3.0f - OS:
Windows 10 - Unityに入れたパッケージ:
Universal RP
バグについて
-
バグの内容
Unity-2021.3.0fにおいて、VRMのテクスチャで本来透明にしている箇所が透明になりません。他のパッケージとの兼ね合いもあるかもしれませんので、ひとまずバグとして報告させていただきますが、仕様なのかどうかご確認お願いいたします。 一応私の使い方の範疇での対処方法はわかっております。
-
ConsoleLog
-
スクリーンショット

- 再現方法
- プロジェクトを 2020.3.xxf から 2021.3.0f1 にアップデート
- ビルドする
- ビルドしたファイルを実行する(Windows:exe、WebGL:html)
- アプリ内でVRMを開く
- スクリーンショットの通りになる。
※症状は、エディタ上で _BlendMode を Opaque にした状態と合致
再現のポイント:
- パッケージ
Universal RPをインストールしている
Unity-2021.3.0f1より前(2020.3.32f1など):
- Unityエディタ上、ビルド物どちらでもVRMのテクスチャは正常に透明・不透明が反映される。
Unity-2021.3.0f1:
- ビルド物での実行において、スクリーンショットの通りになる。
- Unityエディタ上でプレイすると正常に反映される。
UniVRMのサンプル SimpleViewer でも上記手順を踏み、再現したことを確認。
Universal RP を削除後:
- ビルド物での実行で正常化する
UniVRMのサンプル
- エラーの発生するファイル(ここに貼り付けても差し支えの無いもの)
報告ありがとうございます。
Unity-2021.3 の確認まだとれてません。
URP の挙動が変わっているのかもしれません。
UniVRM はデフォルトでは、URP のインストールの有無と無関係に、
builtin material をロードします。
オプションで、マテリアル差し替え機能を有効にすることで URP にスイッチできますが、
まだ、MToon の URP 版がありません。
v0.100 から Unity-2019.4 のサポートを終了して、Unity-2021.3 作業を増やしていく予定です。
2021.3 で試してみましたが特に再現せず、よくわかりませんでした。 UniVRM の URP サポート状況は、
- ロード時にMaterialを差し替えるインタフェース実装済み
- URP 向けのマテリアルの実装(MToon が無い)
という感じで、独自に URP マテリアルを管理できる人向けです。 https://vrm-c.github.io/UniVRM/ja/api/how_to_customize_material_import.html
私も同様の問題がありました。Runtimeで、MToonのモデルをURP用に読み込むと、目と眉毛が黒くなる、一部モデルの色がおかしくなる、という問題が起きます。Built-in shaderでは正常に表示されます。
環境
- UniVRM version: 0.108.0
- Unity version: 2022.2.0f1
- OS: macOS 13.0.1
- Unityに入れたパッケージ: Universal RP
Editor上で確認した結果
- 目と眉毛が黒くなるのは、
Rendering TypeをTransparentにすると直る - 一部モデルの色がおかしくなるのは、
Vertex Color Blend ModeをNoneにすると直る
ということが分かったので、一時的に下記コードで対応しようと考えています。もしバグであれば対応していただけると嬉しいです。
RuntimeGltfInstance newInstance;
try {
newInstance = await VrmUtility.LoadAsync(
path: path,
awaitCaller: new RuntimeOnlyAwaitCaller(),
materialGeneratorCallback: (vrm) => new UrpVrmMaterialDescriptorGenerator(vrm)
);
}
catch (Exception ex) {
// Error
return;
}
using (GltfData data = new AutoGltfFileParser(path).Parse()) {
int matCount = newInstance.Materials.Count;
try {
var vrm = new VRMData(data);
for (int i=0; i<matCount; i++) {
Material material = newInstance.Materials[i];
glTF_VRM_Material vrmMaterial = vrm.VrmExtension.materialProperties[i];
string renderTypeTag = material.GetTag("RenderType", false);
if (renderTypeTag == "Opaque") {
if (vrmMaterial.keywordMap.ContainsKey("_ALPHABLEND_ON")
&& vrmMaterial.keywordMap["_ALPHABLEND_ON"]) {
material.SetOverrideTag("RenderType", "Transparent");
material.EnableKeyword("_ALPHABLEND_ON");
material.EnableKeyword("_ALPHATEST_ON");
material.renderQueue = (int)RenderQueue.Transparent;
} else if (vrmMaterial.keywordMap.ContainsKey("_ALPHATEST_ON")
&& vrmMaterial.keywordMap["_ALPHATEST_ON"]) {
material.SetOverrideTag("RenderType", "TransparentCutout");
material.EnableKeyword("_ALPHATEST_ON");
material.renderQueue = (int)RenderQueue.AlphaTest;
}
}
if (vrmMaterial.shader == "VRM/MToon") {
material.DisableKeyword("_VERTEXCOL_MUL");
}
}
} catch (Exception e) {
// Error
}
}
This issue has been labeled as "stale" due to no response by the reporter within 1 month (and 7 days after last commented by someone). And it will be closed automatically 14 days later if not responded.
This issue has been closed due to no response within 14 days after labeled as "stale", 7 days after last reopened, and 7 days after last commented.