当前位置: 首页 > 知识库问答 >
问题:

macos - Unity 2022.3.17f1c1 macOs 下 Addressable 与URP Shader 异常问题?

韦晟睿
2024-09-19

Unity 版本:2022.3.17f1c1
系统环境:macOs

使用 Addressable 进行资源管理。

URP下,一个简单的按顶点差分顶点颜色的 shader。

Shader "Unlit/VertexPureColor"
{
    Properties
    {
        // _MainTex ("Texture", 2D) = "white" {}
        // _Color ("Color", Color) = (1,1,1,1)
    }
    SubShader
    {
        Tags { 
            "RenderType"="Opaque" 
            "RenderPipeline"="UniversalRenderPipeline"
        }
        LOD 100

        Pass
        {
            HLSLPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #pragma multi_compile_instancing
            #pragma multi_compile_fog

            #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"

            struct Attributes
            {
                float4 positionOS : POSITION;
                float4 color : COLOR;
                UNITY_VERTEX_INPUT_INSTANCE_ID
            };

            struct Varyings
            {
                float4 positionHCS : SV_POSITION;
                float4 color : COLOR;
                UNITY_VERTEX_INPUT_INSTANCE_ID
            };

            Varyings vert (Attributes v)
            {
                Varyings o;
                UNITY_SETUP_INSTANCE_ID(v);
                UNITY_TRANSFER_INSTANCE_ID(v, o);
                o.positionHCS = TransformObjectToHClip(v.positionOS.xyz);
                o.color = v.color;
                return o;
            }

            half4 frag (Varyings i) : SV_Target
            {
                UNITY_SETUP_INSTANCE_ID(i);
                return i.color;
            }
            ENDHLSL
        }

    }
}

Addressable 的 Play Mode Script 使用 Use Asset Database 时一切正常。
image.png

但实际打包后,或 Addressable 的 Play Mode Script 使用 Use Existing Build 时会出现 shader 异常。
image.png
image.png

Frame Debugger 时可以看到 shader 替换到 InternalErrorShader。
image.png

在用 addressable 加载完毕 Material 后再进入场景。
结果依旧是粉色。

共有1个答案

皇甫俊雅
2024-09-19

针对您描述的 Unity 2022.3.17f1c1 在 macOS 下使用 Addressable Assets 与 Universal Render Pipeline (URP) Shader 遇到的异常问题,这里有几个可能的解决方案和检查步骤:

  1. 确保 Shader 变异正确编译

    • 检查 Shader 变异是否包括所有必要的编译变体(如多实例化、雾等)。在您的 Shader 中已经包含了这些编译指令,但确保它们没有因为其他原因(如配置错误)而被忽略。
  2. 检查 Shader 变体数据库

    • 在 Unity 编辑器中,尝试在 Shader 编辑器中查看并确认 Shader 变体是否已正确生成。您可以通过选择 Shader,然后在 Inspector 窗口中查看“Shader Variants”来确认。
  3. Addressable Assets 配置

    • 确保 Addressable Assets 的配置在打包和运行时都是一致的。特别是检查地址表的生成和加载逻辑,确保没有遗漏或错误。
    • 尝试清理并重新生成 Addressable Assets 的地址表。
  4. 打包设置

    • 检查您的打包设置,特别是与 Shader 相关的部分。确保在打包时包含了所有必要的 Shader 和相关的资源。
    • 尝试使用不同的打包模式(如包含所有 Shader 变体)来看是否有改善。
  5. Shader 编译日志

    • 查看 Shader 编译日志以获取更多关于错误的信息。这可以在 Unity 控制台中找到,或者通过 Unity 的 Shader Compiler 日志功能来详细查看。
  6. Shader 替换问题

    • 既然在 Frame Debugger 中看到 Shader 被替换为 InternalErrorShader,这通常意味着 Shader 在运行时无法正确加载或编译。确保 Shader 文件的路径和命名在 Addressable Assets 中正确无误。
    • 检查是否有任何插件或自定义脚本在运行时修改了 Shader 的行为或加载方式。
  7. 更新和兼容性

    • 尝试更新 Unity 和 URP 到最新版本,以获取可能的修复和改进。
    • 检查 Unity 和 URP 的官方文档和社区论坛,看看是否有其他开发者遇到并解决了类似的问题。
  8. 代码检查

    • 确保在加载 Material 和 Shader 时没有错误发生。您可以在加载完成后添加一些日志输出来确认加载状态。
    • 如果您的 Shader 使用了自定义的 Shader Graph 或 ShaderLab 特性,请确保这些特性在运行时是可用的。

如果以上步骤都无法解决问题,您可能需要更详细地检查您的项目设置或寻求来自 Unity 社区或官方支持的帮助。

 类似资料:
  • 问题内容: 异常存储在哪里?堆,堆。如何为异常分配和释放内存?现在,如果您有多个需要处理的异常,是否创建了所有这些异常的对象? 问题答案: 我假设为异常分配的内存分配方式与所有其他对象(在堆上)分配方式相同。 这曾经是个问题,因为您不能为OutOfMemoryError分配内存,这就是直到Java 1.6之前 才没有堆栈跟踪的原因。现在,它们也为stacktrace预分配了空间。 如果您想知道在抛

  • 问题内容: 我正在编写一个查找素数的程序。我将素数和所有正整数(现在到100)存储为两个。这是代码: 但是,当我运行该程序时,出现以下错误: 线程“主”中的异常java.lang.IndexOutOfBoundsException:索引:3,大小:3 at java.util.ArrayList.rangeCheck(ArrayList.java:653)at java.util.ArrayLis

  • 本节介绍如何使用三个异常处理程序组件(try、catch 和 finally)来编写异常处理程序。 然后,介绍了 Java SE 7中引入的 try-with-resources 语句。 try-with-resources 语句特别适合于使用Closeable的资源(例如流)的情况。 本节的最后一部分将通过一个示例来分析在各种情况下发生的情况。 以下示例定义并实现了一个名为ListOfNumbe

  • 本文向大家介绍请问运行时异常与受检异常有什么区别?相关面试题,主要包含被问及请问运行时异常与受检异常有什么区别?时的应答技巧和注意事项,需要的朋友参考一下 考察点:异常 异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误,只要程序设计得没有问题通常就不会发生。受检异常跟程序运行的上下文环境有关,即使程序设计无误,仍然可能因使用的问题而引发

  • 问题内容: 我有一个关于异常处理的问题。考虑以下Java代码段。 我知道这是处理异常的推荐方法。但是我可以通过使用以下代码片段来实现相同的目的。 有人可以告诉我第二种方法的弊端吗? 问题答案: 第二种方法可读性较差。此外,即使“聪明”的窍门是使用instanceof关键字,Pokemon异常处理也永远不会走。无论如何,我不是在取笑或嘲笑您,但最好是编写供人类阅读和维护的代码,而不是计算机。

  • 升级到1.9.3+版本后编译失败 主要明显的就是IpUtils.getIp和request的.state报错。 这是因为从v1.9.3版本开始,对项目进行了一些优化,具体优化内容参考:v1.9.3 (opens new window)和v1.9.4 (opens new window)。 新版本的使用方式,参考JustAuth-demo (opens new window) @RequestMap