UniVRM icon indicating copy to clipboard operation
UniVRM copied to clipboard

[URP?] Unity 2021.3.0f以上において、テクスチャの透明にしている部分が透明にならない。再現できなかった

Open nishlumi opened this issue 3 years ago • 2 comments

環境情報

  • UniVRM version: 0.97.0 以上
  • Unity version: Unity-2021.3.0f
  • OS: Windows 10
  • Unityに入れたパッケージ: Universal RP

バグについて

  • バグの内容

    Unity-2021.3.0fにおいて、VRMのテクスチャで本来透明にしている箇所が透明になりません。他のパッケージとの兼ね合いもあるかもしれませんので、ひとまずバグとして報告させていただきますが、仕様なのかどうかご確認お願いいたします。 一応私の使い方の範疇での対処方法はわかっております。

  • ConsoleLog

  • スクリーンショット

univrm_houkoku

  • 再現方法
  1. プロジェクトを 2020.3.xxf から 2021.3.0f1 にアップデート
  2. ビルドする
  3. ビルドしたファイルを実行する(Windows:exe、WebGL:html)
  4. アプリ内でVRMを開く
  5. スクリーンショットの通りになる。

 ※症状は、エディタ上で _BlendModeOpaque にした状態と合致

再現のポイント:

  • パッケージ Universal RP をインストールしている

Unity-2021.3.0f1より前(2020.3.32f1など):

  • Unityエディタ上、ビルド物どちらでもVRMのテクスチャは正常に透明・不透明が反映される。

Unity-2021.3.0f1:

  • ビルド物での実行において、スクリーンショットの通りになる。
  • Unityエディタ上でプレイすると正常に反映される。

UniVRMのサンプル SimpleViewer でも上記手順を踏み、再現したことを確認。

Universal RP を削除後:

  • ビルド物での実行で正常化する

UniVRMのサンプル

  • エラーの発生するファイル(ここに貼り付けても差し支えの無いもの)

nishlumi avatar Apr 21 '22 02:04 nishlumi

報告ありがとうございます。 Unity-2021.3 の確認まだとれてません。 URP の挙動が変わっているのかもしれません。

UniVRM はデフォルトでは、URP のインストールの有無と無関係に、 builtin material をロードします。 オプションで、マテリアル差し替え機能を有効にすることで URP にスイッチできますが、 まだ、MToon の URP 版がありません。 v0.100 から Unity-2019.4 のサポートを終了して、Unity-2021.3 作業を増やしていく予定です。

ousttrue avatar May 11 '22 08:05 ousttrue

2021.3 で試してみましたが特に再現せず、よくわかりませんでした。 UniVRM の URP サポート状況は、

  • ロード時にMaterialを差し替えるインタフェース実装済み
  • URP 向けのマテリアルの実装(MToon が無い)

という感じで、独自に URP マテリアルを管理できる人向けです。 https://vrm-c.github.io/UniVRM/ja/api/how_to_customize_material_import.html

ousttrue avatar Jun 06 '22 09:06 ousttrue

私も同様の問題がありました。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 TypeTransparent にすると直る
  • 一部モデルの色がおかしくなるのは、Vertex Color Blend ModeNone にすると直る

ということが分かったので、一時的に下記コードで対応しようと考えています。もしバグであれば対応していただけると嬉しいです。

        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
            }
        }

magicien avatar Mar 15 '23 12:03 magicien

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.

github-actions[bot] avatar Oct 17 '23 05:10 github-actions[bot]

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.

github-actions[bot] avatar Nov 01 '23 05:11 github-actions[bot]