要须心地收汗马,孔孟行世目杲杲。这篇文章主要讲述Unity论坛问答-SRP合批在安卓平台不起作用相关的知识,希望能为你提供帮助。
【Unity论坛问答-SRP合批在安卓平台不起作用】原贴: SRP Batcher not working on Android for custom shader with URP
题主stephero问道:
自己写了一个最简单的着色器,
Shader "Hidden/SimpleSRPTest" { Properties { }SubShader { Pass { Cull FrontCGPROGRAM#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了?
推荐阅读
- kubectl apply -fservice.yaml
- Android Thread 常用方法
- 解决android studio 文本乱码问题
- Android | Android Studio打包APK安装失败(应用是非正式版本,当前设备不支持安装)
- Android View 从左边滑出动画 ,以及从左上,左下,右上,右下放大动画。
- Power Apps 弹出界面popup dialog
- Spring Boot + Spring Security + JWT + MySQL + React Full Stack Polling App - Part 1
- uniapp调取摄像头扫码和生成二维码
- Fastlane AppStore 执行流程分析