shader_feature非常相似multi_compile。唯一的区别是Unity shader_feature在最终版本中不包含未使用的着色器变体。所以shader_feature适用于在我们在编辑器中,选中材质,设置它使用的shader的宏,如果在程序中动态的去设置可能无效(原因下面说明)。而对于multi_compile,会把所有的变体都编译进程序里,所以适合需要在程序运行中...
在unity中我们可以通过使用#pragma multi_compile或#pragma shader_feature指令来为shader创建多个稍微有点区别的shader变体。这个Shader被称为宏着色器(mega shader)或者超着色器(uber shader)。实现原理:根据不同的情况,使用不同的预处理器指令,来多次编译Shader代码。 在运行时,Unity从Material宏Material.EnableKeyword和...
我们用ShaderLab编写Unity中的Shader,当我们需要让Shader同时满足多个需求,例如,这个是否支持阴影,此时就需要加Keyword(关键字),例如在代码中#pragma multi_compile SHADOW_ON SHADOW_OFF,对逻辑上有差异的地方用#ifdef SHADOW_ON或#if defined(SHADOW_ON)区分,#if defined()的好处是可以有多个条件,用与、或逻辑运算...
multi_compile和shader_feature功能很像,最大的区别是对于shader_feature,没有使用的变体不会在构建时包含进去,所以对于shader_feature最好是直接在材质上设置好关键词(选项选好,开关开好),不然可能在运行时设置可能无效,因为对应的shader变体可能没有包含进来,multi_compile则没有这个问题,全局设置也可以。 Properties{...
在unity中我们可以通过使用#pragma multi_compile或#pragma shader_feature指令来为shader创建多个稍微有点区别的shader变体。这个Shader被称为宏着色器(mega shader)或者超着色器(uber shader)。实现原理:根据不同的情况,使用不同的预处理器指令,来多次编译Shader代码。
在unity中我们可以通过使用#pragma multi_compile或#pragma shader_feature指令来为shader创建多个稍微有点区别的shader变体。这个Shader被称为宏着色器(mega shader)或者超着色器(uber shader)。实现原理:根据不同的情况,使用不同的预处理器指令,来多次编译Shader代码。 在运行时,Unity从Material宏Material.EnableKeyword和...
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__,但是枚举的关键字...
1.1 multi_compile和shader_feature的区别 用multi_compile声明的Keyword是全排列组合,例如: #pragma multi_compile A B #pragma multi_compile C D E 组合出来就是AC、AD、AE、BC、BD和BE6个,如果再来一个#pragma multi_compile F G显然会直接翻倍为12个。
一、什么是Shader变体管理 想要回答这个问题,要看看什么是Shader变体。 1. 变体 我们用ShaderLab编写Unity中的Shader,当我们需要让Shader同时满足多个需求,例如说,这个是否支持阴影,此时就需要加keyword(关键字),例如在代码中#pragma multi_compile SHADOW_ON SHADOW_OFF,对逻辑上有差异的地方用#ifdef SHADOW_ON或#if...