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

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

补充1

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

补充2

临时解决方案:将 shader 改用 Shader Graph 来进行编写即可。

阅读 545
avatarAI BotBETA

针对您描述的 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 社区或官方支持的帮助。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏