1. 利用UsePass可以帮助投影pass合批。相同网格、不同材质、不同shader,只要这些shader使用UsePass引用了同一个pass,并且材质的属性和宏都一样,那么这些物体的投影pass就可以合批(包括GPU Instancing和SRP Batcher)。注:这个投影pass的特殊处理可能是context.DrawShadows带来的,其他的pass享受不到这个好处。

2. 想要shader兼容SRP Batcher,就需要该shader的所有pass的UnityPerMaterial cbuffer的layout(排列和大小)都一样。注1:实际上unity会对齐cbuffer的大小,也就是说一个pass有1个half,另一个pass有4个half,那这个shader还是兼容SRP Batcher的;注2:还不确定排列顺序影不影响,待测试。

3.想要同时实现1和2,就需要所有想利用UsePass的shader的所有pass的UnityPerMaterial cbuffer的排列大小都一样,并且UnityPerMaterial cbuffer里的所有变量都要在所有shader的属性表里声明。

4.SHADER_API_MOBILE这个shader宏在编辑器下不同版本表现不一致。目前可以确定的是Windows编辑器安卓平台2020.3.17及之前都是关闭的。在3.17到3.22之间的某个版本发生了改变,Windows编辑器安卓平台DX11下是关闭的,Vulkan和OpenGLES3是开启的。而Application.IsMobilePlatform这个接口在编辑器安卓平台下一直是false。这就导致Windows编辑器安卓平台下的显示效果会有问题,比如URP的多光源渲染就与这个问题有关。从2020.3.17之后的某个版本开始,Windows编辑器安卓平台Vulkan或OpenGLES3下,URP的多光源一直是坏的。

5.2021为了解决4这个问题,脚本中改用接口GraphicsSettings.HasShaderDefine(BuiltinShaderDefine.SHADER_API_MOBILE)来判断是否是移动平台。但是2020在这里又出毛病了,还是3.17到3.22之间的某个版本开始,这个接口在DX11下也返回true!

6.至少从2019开始,编辑器(包括windows和mac)移动平台(包括ios和安卓)下,SHADER_API_MOBILE这个宏在compute shader中一直是开启的。

7.context.DrawRenderers有个技巧:不用多次调用也能画多pass。DrawingSettings可以设置多个PassName,比如传进了UniversalForward和UniversalForwardOnly这两个。那么这次Draw所有有UniversalForward或UniversalForwardOnly这两个pass的shader都会绘制。而如果某个shader同时有这两个pass,那么这个shader的这两个pass都会绘制出来。但是如果同名的pass有多个则只会绘制第一个。另外pass的绘制顺序是DrawingSettings的SetShaderPassName的Index顺序。利用这个机制可以实现写深度的半透明。

内容来源于网络如有侵权请私信删除

文章来源: 博客园

原文链接: https://www.cnblogs.com/vkensou/p/16644680.html

你还没有登录,请先登录注册
  • 还没有人评论,欢迎说说您的想法!