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查看则合批失败.

Unity论坛问答-SRP合批在安卓平台不起作用

 

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了?

Unity论坛问答-SRP合批在安卓平台不起作用

上一篇:如何给grub加密码


下一篇:Android Thread 常用方法