找回密码
 立即注册
查看: 410|回复: 0

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

[复制链接]
发表于 2021-12-29 17:50 | 显示全部楼层 |阅读模式
大纲


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

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的变体传输过来,并且进行了正确的打包!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-16 11:30 , Processed in 0.094999 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表