起因:Shader和材质打包AB后,游戏加载资源显示异常 目的:了解Shader、材质和变体收集的AB打包关系 准备步骤: 创建DemoShader1,并使用multi_compile和shader_feature的定义宏开关来设置不同颜色: Shader"AbShaderDemo/DemoShader1"{Properties{//... 省略// 允许材质勾选启用宏开关[Toggle(SF_COLOR)]_SF_COLOR("SF_...
打包时会将multi_compile和shader_feature分为两堆,分别计算组合数,然后两者再组合,例如: 1 2 3 4 #pragma multi_compile A B #pragma multi_compile C D #pragma shader_feature E F #pragma shader_feature G H 当你只打两个材质,引用的变体分别是ADEG和ACFH,前两个multi_compile组直接组合成4个变体,...
shader_feature则不同,它打包时,找到打包资源对变体的引用,最普通能对变体引用的资源是Material(例如场景用了一个MeshRenderer,MeshRenderer用了这个材质,材质用了这个Shader的一个变体)。 在Inspector窗口右上角将Normal换成Debug模式,可以看到材质引用的Keyword组合: 假如将上述multi_compile替换为shader_feature: #pragm...
打包时会将multi_compile和shader_feature分为两堆,分别计算组合数,然后两者再组合,例如: #pragma multi_compile A B #pragma multi_compile C D #pragma shader_feature E F #pragma shader_feature G H 当你只打两个材质,引用的变体分别是ADEG和ACFH,前两个multi_compile组直接组合成4个变体,后面两个shad...
1.内存中ShaderLab的大小和变体成正比关系。从减少内存方面应该尽量减少变体数量,可以使用 #pragma skip_variants。 2.在使用ShaderVariantCollection收集变体打包时,只对shader_feature定义的宏有意义,multi_compile的变体不用收集也会被全部打进包体。 3.2018.2新功能OnProcessShader可以移除无用的shader变体。比#pragma...
打ab包的时候,Unity会把shader中所有的multi_complie定义的变体全部打包,shader可以正常显示。但shader_feature就不那么尽人意了。 需要注意: 其中指定的第一个关键字是默认生效的。 使用multi_compile声明的都为全局关键字,一个项目种全局关键字最多只能有256个,内建shder大约已经用了60个。
其次,之前的例子都用的是multi_compile,但实际上不一定需要multi_compile,某些情况下用shader_feature是可以的。 1.1 multi_compile和shader_feature的区别 用multi_compile声明的Keyword是全排列组合,例如: #pragma multi_compile A B #pragma multi_compile C D E ...
一、什么是Shader变体管理 想要回答这个问题,要看看什么是Shader变体。 1. 变体 我们用ShaderLab编写Unity中的Shader,当我们需要让Shader同时满足多个需求,例如,这个是否支持阴影,此时就需要加Keyword(关键字),例如在代码中#pragma multi_compile SHADOW_ON SHADOW_OFF,对逻辑上有差异的地方用#ifdef SHADOW_ON或#if ...
Shader单独打包,使用multi_compile定义全部宏 全部变体都被生成,不会发生需要的变体未生成的情况 生成的变体数量庞大,严重浪费资源 Shader单独打包,shader_feature与multi_compile结合使用 能够有效控制变体数量 如何确定哪些变体需要生成 容易遗漏需要生成的变体
shader_feature_local_vertex 实际使用中multi_compile与shader_feature基本没有区别。他们主要有两个区别。第一个是在shader_feature后面只跟了一个宏的时候,会生成两个变体,一个是不包含该宏,另一个是包含该宏。另一个区别是打包时的表现。在打包的时候shader_feature不会包含没有使用的变体,而multi_compile会排列...