Unity Shader variants (shader 变体)

官方地址
https://docs.unity3d.com/cn/2022.2/Manual/SL-MultipleProgramVariants.html
教程可以看这里
https://www.jianshu.com/p/48ad75f0b4b9
https://www.jianshu.com/p/3e6b84317097

变种用我自己的理解就是
能用程序控制的shader

举个例子
在这里插入图片描述
这里声明了 a b c d
四个变量(其实是开关 下面会说)
记住 #pragma multi_compile 必须放在 CGPROGRAM 下面
在这里插入图片描述
在c#程序里

Shader.EnableKeyword("D");

就可以了
点击shader文件
在这里插入图片描述
可以看到这里 点那个按钮 会自动编译shader并打开shader文件

在打开的文件里面你会找到
Keywords: A
Keywords: B
Keywords: C
Keywords: D
等内容

在这里插入图片描述
在这里插入图片描述
这里显示一共有多少个变体
也可以点show 他会告诉你具体有哪些
在这里插入图片描述
也会显示这些内容
加完以后 无法刷新 可以点击
在这里插入图片描述
重新加载

那如果这样声明呢
在这里插入图片描述
你会发现编译后的文件显示的是这样的
Keywords: A EE
Keywords: A FF
Keywords: B FF
Keywords: B EE
Keywords: C FF
Keywords: C EE
Keywords: D EE
Keywords: D FF
看见了没
他一共生成了 4 * 2 共计 8个

这就是unity 优化编译的方式

记住
指定的第一个关键字是默认生效的,即默认使用变体A和EE

shader_feature的话 作用是一样的
不过他会删除 没有材质引用过的shader
如果没引用过的 也可以放在下面这个地方
Always Included Shaders
在这里插入图片描述
你也可以
声明的时候用这个
在这里插入图片描述
__和字母中间有空格
这样只需占用一个变量位置
但依然是两个shader变体 一个是非A 一个是A
你可以用代码控制
Shader.EnableKeyword(“A”);
Shader.DisableKeyword(“A”);
如果代码不设置 那么默认就是非A
这个是全局使用的 也就说 设置了这个 全局用到这个变量的地方都会有影响

也可以 声明shaer的局部变量

扫描二维码关注公众号,回复: 15170224 查看本文章
#pragma multi_compile_local __ A

设置的时候需要用
Material.EnableKeyword
全局和局部声明了同样的名字
优先用局部的

var m = this.GetComponent<MeshRenderer>();
m.material.EnableKeyword("A");

关于keyworkd的限制
2022版unity是这么说的
官方文档看这里
https://docs.unity3d.com/cn/2022.2/Manual/shader-keywords.html#keyword-limits

Unity can use up to 4,294,967,294 global shader keywords. Individual shaders and compute shaders can use up to 65,534 local shader keywords. These totals include keywords used for variants, and keywords used for dynamic branching.

Every keyword declared in the shader source file and its dependencies count towards this limit. Dependencies include Passes that the shader includes with UsePass, and fallbacks.

If Unity encounters a shader keyword with the same name multiple times, it only counts towards the limit once.

If a shader uses more than 128 keywords in total, it incurs a small runtime performance penalty; therefore, it is best to keep the number of keywords low. Unity always reserves 4 keywords per shader.

反正就是节省点使用

创建shader的时候 你会发现这么个东西

在这里插入图片描述
这是shader 变体收集器
假如shader后是这样的
在这里插入图片描述
点加号可以看到
在这里插入图片描述
就不详细讲解了
可以看开头的教程链接
还可以
https://github.com/crossous/SocoTools

在这里插入图片描述
也可以在这里 先clear
然后玩一遍游戏
再 save to asset 成一个文件
不过这个不是特别准。

可以看看这个大佬的工具
https://github.com/crossous/SocoTools

猜你喜欢

转载自blog.csdn.net/qq_38913715/article/details/130826211