shader_feature非常相似multi_compile。唯一的区别是Unity shader_feature在最终版本中不包含未使用的着色器变体。所以shader_feature适用于在我们在编辑器中,选中材质,设置它使用的shader的宏,如果在程序中动态的去设置可能无效(原因下面说明)。而对于multi_compile,会把所有的变体都编译进程序里,所以适合需要
三,multi_complie_local 全局的Keyword只能有256个,这或许会最终对我们造成限制,而且大部分Keyword并不需要进行全局声明。 因此,我们可以使用multi_complie_local来声明局部的、只在该Shader内部起作用的Keyword,用法相似: #pragma multi_compile_local __ A //OR #pragma shader_feature_local __ A //---A模块-...
我们用ShaderLab编写Unity中的Shader,当我们需要让Shader同时满足多个需求,例如,这个是否支持阴影,此时就需要加Keyword(关键字),例如在代码中#pragma multi_compile SHADOW_ON SHADOW_OFF,对逻辑上有差异的地方用#ifdef SHADOW_ON或#if defined(SHADOW_ON)区分,#if defined()的好处是可以有多个条件,用与、或逻辑运算...
因此,我们可以使用multi_complie_local来声明局部的、只在该Shader内部起作用的Keyword,用法相似: #pragmamulti_compile_local __ A//OR #pragma shader_feature_local __ A//---A模块---#ifAreturnfixed4(1,1,1,1);#endif//---returnfixed4(0,0,0,1); 但需要注意: local Keyword仍有数量限制,每个...
在unity中我们可以通过使用#pragma multi_compile或#pragma shader_feature指令来为shader创建多个稍微有点区别的shader变体。这个Shader被称为宏着色器(mega shader)或者超着色器(uber shader)。实现原理:根据不同的情况,使用不同的预处理器指令,来多次编译Shader代码。 在运行时,Unity从Material宏Material.EnableKeyword和...
1.1 multi_compile和shader_feature的区别 用multi_compile声明的keyword是全排列组合,例如: 组合出来就是AC AD AE BC BD BE6个,如果再来一个显然会直接翻倍为12个。shader_feature则不同,它打包时,找到打包资源对变体的引用,最普通能对变体引用的资源是Material(例如场景用了一个MeshRenderer,MeshRenderer用了这个...
multi_compileshader_feature定义方式#pragma multi_compile A#pragma shader_feature A宏的适用范围所有Shader所有Shader变体的生成生成所有的变体可自定义生成何种变体默认定义的宏默认定义首个宏默认定义首个宏(只有一个宏定义时默认为nokeyword) 1. 定义方式 ...
shader_feature和multi_compile的主要缺点是其中定义的所有关键字均会影响 Unity 的全局关键字计数上限(256 个全局关键字,外加 64 个本地关键字)。为了避免此问题,可以使用不同的着色器变体指令:__shader_feature_local__ 和multi_compile_local。 shader_feature_local:__类似于shader_feature__,但是枚举的关键字...
在unity中我们可以通过使用#pragma multi_compile或#pragma shader_feature指令来为shader创建多个稍微有点区别的shader变体。这个Shader被称为宏着色器(mega shader)或者超着色器(uber shader)。实现原理:根据不同的情况,使用不同的预处理器指令,来多次编译Shader代码。
一、什么是Shader变体管理 想要回答这个问题,要看看什么是Shader变体。 1. 变体 我们用ShaderLab编写Unity中的Shader,当我们需要让Shader同时满足多个需求,例如说,这个是否支持阴影,此时就需要加keyword(关键字),例如在代码中#pragma multi_compile SHADOW_ON SHADOW_OFF,对逻辑上有差异的地方用#ifdef SHADOW_ON或#if...