unity shader编译打包丢失变体

大纲

  • 背景
  • 背景下解决方案
  • 问题

背景

unity的shader_feature对于在代码中Enable或者项目中各种复杂动态坏境的情境下,打包就成了噩梦!!

如果是使用multi_compile之流,那么$n^2$的变体量就可怕了!

所以我想了一下,使用的是的multi_compile,但是利用Unity提供的一套机制,在multi_compile后生成的所有变体中尝试剔除一下不使用的shadervariant,这样从理论上应该能解决问题!

背景下解决方案

先给出一下Unity的接口

public void OnProcessShader(Shader shader, ShaderSnippetData snippet, IList<ShaderCompilerData> data)

snippet是当前的编译信息

data存储了需要编译的所有变体,如果有不需要的,直接从该列表中移除就可以了!

问题

但是在使用了一段时间后,发现有个大坑(估计是我踩到了违反unity使用范例吧),然后发现带FOG_EXP2 keyword的变体在打包shader ab的时候总是没有能打包进ab

这口锅就有点大了!

  • 猜想一:有没有可能是被自己剔除了? 因为Shader的编译是经过自己写的OnProcessShader剔除后才编译的,想着会不会是自己把该变体剔除了;但是结果打印了一下,发现不是!
  • 猜想二:有没有可能是因为没有使用multi_compile去定义FOG_EXP2? 本来Shader里对雾使用的是#pragma multi_compile_fog,在想是不是没有生效?,于是尝试使用了
    #pragma multi_compile _FOG
    #pragma multi_compile FOG_LINEAR FOG_EXP FOG_EXP2
    

    但是结果还是和猜想一一样!在unityOnProcessShader调用的时候,并没有带有FOG_EXP2的变体

  • 猜想三: 其他的OnProcessShaderFOG_EXP2给剔除了? 全局检索了一下,可见的只有两个,一个是我写的,一个URP的,但是URP的那个已经被我禁掉了!说明已经没有其他的改动了!
  • 猜想四:Unity有其他设置搞掉了这个?  unityProject Setting>Graphics中,有个选项,发现开启了这个后 ,OnProcessShader就能把到有FOG_EXP2的变体传输过来,并且进行了正确的打包!