zoukankan      html  css  js  c++  java
  • Unity论坛问答-SRP合批在安卓平台不起作用

    原贴: SRP Batcher not working on Android for custom shader with URP

    题主stephero问道:

    自己写了一个最简单的着色器,

        Shader "Hidden/SimpleSRPTest"
        {
            Properties
            {
            }
         
            SubShader
            {
                Pass
                {
                    Cull Front
         
                    CGPROGRAM
         
                    #pragma vertex vert
                    #pragma fragment frag
         
                    #include "UnityCG.cginc"
         
                    struct appdata
                    {
                        float4 vertex : POSITION;
                    };
         
                    struct v2f
                    {
                        float4 posClipSpace : SV_POSITION;
                    };
         
                    v2f vert(appdata v)
                    {
                        v2f o;
                        o.posClipSpace = UnityObjectToClipPos(v.vertex);
                        return o;
                    }
         
                    half4 frag(v2f i) : SV_Target   { return 1; }
         
                    ENDCG
                }
            }
        }

    在编辑器中可以看到SRP Batcher标记为compatible.

    编辑器或者编译成Windows版本, 用Frame Debugger查看, 都能看到成功合批.

    但是编译为安卓版, 用Frame Debugger查看则合批失败.

    aleksandrk回答道:

    这是因为使用UnityCG.cginc的原因.

    SRP Batcher需要用到CBUFFER相关的宏, 如果引用了UnityCG.cginc, 那么会引用到HLSLSupport.cginc.

    相关代码如下:

    #if defined(SHADER_API_D3D11) || defined(UNITY_ENABLE_CBUFFER) || defined(SHADER_API_PSSL)
    #define CBUFFER_START(name) cbuffer name {
    #define CBUFFER_END };
    #else
    // On specific platforms, like OpenGL, GLES3 and Metal, constant buffers may still be used for instancing
    #define CBUFFER_START(name)
    #define CBUFFER_END
    #endif
    

     可见仅在D3D11和PSSL下真正定义了CBUFFER, 而编辑器和Windows版本都是D3D11.

    解决方案一是从SRP Core中引入Common.hlsl, 二是加入#pragma enable_cbuffer.

    最后题主比较喜欢后面这个方案.

    一些说明:

    1. 写URP还是从phi-lira的模板开始比较好. (UniversalPipelineTemplateShader.shader)

    2. 自己写一套的SRP的话也是从phi-lira的这个模板开始为好: CustomSRP

    3. SRP不再使用CG了, 这在知乎上有个讨论: 新版Unity shader库为什么用HLSL,而不用CG了?

  • 相关阅读:
    python爬虫
    RMQ算法
    组合数
    水池数目
    jQuery 拼接事件
    ORACLE
    day 75
    day74 vue框架
    day73 vue框架
    day 72 vue框架
  • 原文地址:https://www.cnblogs.com/yusjoel/p/13270232.html
Copyright © 2011-2022 走看看