CGPROGRAM// Physically based Standard lighting model, and enable shadows on all light types//#pragma surface surf Standard fullforwardshadows#include"UnityCG.cginc"//#pragma shader_feature Red Green Blue#pragmamulti_complie_local __ Red Green Blue//#pragma multi_compile __ Pink */// Use shade...
shader_feature则不同,它打包时,找到打包资源对变体的引用,最普通能对变体引用的资源是Material(例如场景用了一个MeshRenderer,MeshRenderer用了这个材质,材质用了这个Shader的一个变体)。 在Inspector窗口右上角将Normal换成Debug模式,可以看到材质引用的Keyword组合: 假如将上述multi_compile替换为shader_feature: #pragm...
第一个是在shader_feature后面只跟了一个宏的时候,会生成两个变体,一个是不包含该宏,另一个是包含该宏。另一个区别是打包时的表现。在打包的时候shader_feature不会包含没有使用的变体,而multi_compile会排列组合所有变体。 2.变体 Unity在编译shader时,不同的宏组合会生成独立的shader程序,这些独立的shader程序...
第一个是在shader_feature后面只跟了一个宏的时候,会生成两个变体,一个是不包含该宏,另一个是包含该宏。另一个区别是打包时的表现。在打包的时候shader_feature不会包含没有使用的变体,而multi_compile会排列组合所有变体。 2.变体 Unity在编译shader时,不同的宏组合会生成独立的shader程序,这些独立的shader程序...
一、什么是Shader变体管理 想要回答这个问题,要看看什么是Shader变体。 1. 变体 我们用ShaderLab编写Unity中的Shader,当我们需要让Shader同时满足多个需求,例如,这个是否支持阴影,此时就需要加Keyword(关键字),例如在代码中#pragma multi_compile SHADOW_ON SHADOW_OFF,对逻辑上有差异的地方用#ifdef SHADOW_ON或#if ...
1.内存中ShaderLab的大小和变体成正比关系。从减少内存方面应该尽量减少变体数量,可以使用 #pragma skip_variants。 2.在使用ShaderVariantCollection收集变体打包时,只对shader_feature定义的宏有意义,multi_compile的变体不用收集也会被全部打进包体。 3.2018.2新功能OnProcessShader可以移除无用的shader变体。比#pragma...
ShaderLab提供了两种方式来声明Shader宏(uniform):multi_compile和shader_feature。multi_compile声明一组宏,所有声明的宏在编译时都会被处理。下方Shader声明了两组宏,会生成2*3=6种变体。 multi_compile与变体数量关系 shader_feature是multi_compile的子集,在收集变体时会根据资源引用关系,只打包使用到的变体。以下图...
其次,之前的例子都用的是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打包进了AssetBundle中,并且在Shader中使用了shader_feature来定义了宏。 为了完整起见,先从unity的shader variant说起。 ShaderVariant 举个例子,对于一个支持法线贴图的Shader来说,用户肯定希望无论是否为材质提供法线贴图它的Shader都能正确的进行渲染处理。一般有两种方法来保证这种...
别看这些都能Shader实时用Shader编译生成,但引擎不会这么做,而是在打包时就需要知道所有可能用到的变体,将其打包出来。 很浅显的原因是shader编译的时间也不短,Unity/UE这些引擎为了方便用户编写,主要编写的语言是hlsl,如果你的游戏是DX11/DX12,实际运行会将hlsl编译为dxbc,单个的时间不长,但达到一定数量就会有明显...