原貼: SRP Batcher not working on Android for custom shader with URPandroid
題主stephero問道:git
本身寫了一個最簡單的着色器,github
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.app
編輯器或者編譯成Windows版本, 用Frame Debugger查看, 都能看到成功合批.編輯器
可是編譯爲安卓版, 用Frame Debugger查看則合批失敗.spa
aleksandrk回答道:code
這是由於使用UnityCG.cginc的緣由.orm
SRP Batcher須要用到CBUFFER相關的宏, 若是引用了UnityCG.cginc, 那麼會引用到HLSLSupport.cginc.blog
相關代碼以下:ip
#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了?