APSchmidt 发表于 2021-12-29 17:50

unity shader编译打包丢失变体(FOG_EXP2)

大纲


[*]背景
[*]背景下解决方案
[*]问题
背景

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,在想是不是没有生效?,于是尝试使用了   hlsl   #pragma multi_compile _FOG   #pragma multi_compile FOG_LINEAR FOG_EXP FOG_EXP2   但是结果还是和猜想一一样!在unity的OnProcessShader调用的时候,并没有带有FOG_EXP2的变体
[*]猜想三: 其他的OnProcessShader把FOG_EXP2给剔除了?   全局检索了一下,可见的只有两个,一个是我写的,一个URP的,但是URP的那个已经被我禁掉了!说明已经没有其他的改动了!
[*]猜想四:Unity有其他设置搞掉了这个?


   在unity的Project Setting>Graphics中,有个选项,发现开启了这个后 ,OnProcessShader就能把到有FOG_EXP2的变体传输过来,并且进行了正确的打包!
页: [1]
查看完整版本: unity shader编译打包丢失变体(FOG_EXP2)