您现在的位置是:首页 >技术教程 >Unity shader 变种 multi_compile网站首页技术教程

Unity shader 变种 multi_compile

开着房车环游世界 2024-06-20 00:01:02
简介Unity shader 变种 multi_compile

官方地址
https://docs.unity3d.com/cn/2022.2/Manual/SL-MultipleProgramVariants.html
变种用我自己的理解就是
能用程序控制的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

其实也可以 声明局部变量

#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.

反正就是节省点使用

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。