multi_compile

   Used to  compile the shader code multiple times with different preprocessor directives for each case.

   #pragma multi_compile 
  #pragma shader_feature

  

  At runtime, the appropriate shader variant is picked up from the Material keywords (Material.EnableKeyword and DisableKeyword) or global shader keywords (Shader.EnableKeyword and DisableKeyword).

1、How multi_compile works

  #pragma multi_compile FANCY_STUFF_OFF FANCY_STUFF_ON

  Will produce two shader variants, one with FANCY_STUFF_OFF defined, and another with FANCY_STUFF_ON. At runtime, one of them will be activated based on the Material or global shader keywords.

  If neither of these two keywords are enabled then the first one (“off”) will be used.

  Following will produce four shader variants:

  #pragma multi_compile SIMPLE_SHADING BETTER_SHADING GOOD_SHADING BEST_SHADING

  When any of the names are all underscores, then a shader variant will be produced, with no preprocessor macro defined.

  Following directive below will produce two shader variants; first one with nothing defined, and second one with FOO_ON defined:

    

2、Difference between shader_feature and multi_compile

  The only difference is that unused variants of shader_feature shaders will not be included into game build. So shader_feature makes most sense for keywords that will be set on the materials, while multi_compile for keywords that will be set from code globally.

  Additionally, it has a shorthand notation with just one keyword,Which is just a shortcut for #pragma shader_feature _ FANCY_STUFF, i.e. it expands into two shader variants (first one without the define; second one with it).

  #pragma shader_feature FANCY_STUFF

  #pragma shader_feature _ FANCY_STUFF

3、Keyword limit

  There is a limit of 256 keywords in Unity, and around 60 of them are used internally.

  So be careful not to exceed the limit when multiple keywords are defined in several different Shaders.

4、Built-in multi_compile shortcuts

  以下是一些“shortcut”,即意味着一个命令对应着多个 multi_compile。

  • multi_compile_fwdbase compiles all variants needed by ForwardBase (forward rendering base) pass type. The variants deal with different lightmap types and main directional light having shadows on or off.
  • multi_compile_fwdadd compiles variants for ForwardAdd (forward rendering additive) pass type. This compiles variants to handle directional, spot or point light types, and their variants with cookie textures.
  • multi_compile_fwdadd_fullshadows - same as above, but also includes ability for the lights to have realtime shadows.
  • multi_compile_fog expands to several variants to handle different fog types (off/linear/exp/exp2).

  为了减少一些内置条件选项,可以用skip_variants:

#pragma multi_compile_fwdadd
// will make all variants containing
// "POINT" or "POINT_COOKIE" be skipped
#pragma skip_variants POINT POINT_COOKIE

  

参考:https://docs.unity3d.com/Manual/SL-MultipleProgramVariants.html

multi_compile的更多相关文章

  1. [UnityShader基础]06.#pragma multi_compile

    参考链接: https://blog.csdn.net/qq826364410/article/details/81774741 https://docs.unity3d.com/Manual/SL- ...

  2. 多版本Shader与multi_compile

    多版本Shader与multi_compile   https://docs.unity3d.com/Manual/SL-MultipleProgramVariants.html   #pragma ...

  3. Unity multi_compile

    http://docs.unity3d.com/Manual/SL-MultipleProgramVariants.html http://forum.unity3d.com/threads/tuto ...

  4. Shader实例:扭曲,漩涡

    效果: 案例:新仙剑,王者之剑. 在切换场景的时候,就会有这样的全屏扭曲效果. 思路: 1.用GrabPass抓屏到一张纹理中. 2.进行扭曲,绘制到UGUI的Image上. 准备: 去官网下载Uni ...

  5. Shader预处理宏、内置状态变量、多版本编译等

    预定义shader预处理宏: Target platform: SHADER_API_OPENGL - desktop OpenGL SHADER_API_D3D9 - Direct3D SHADER ...

  6. 水面shader 线性擦除

    // Upgrade NOTE: replaced 'PositionFog()' with multiply of UNITY_MATRIX_MVP by position // Upgrade N ...

  7. Unity ShaderLab学习总结

    http://www.jianshu.com/p/7b9498e58659 Unity ShaderLab学习总结 Why Bothers? 为什么已经有ShaderForge这种可视化Shader编 ...

  8. 给The Lab Renderer for Unity中地形添加阴影

    The Lab Renderer for Unity是Valve针对VR在Unity的体验渲染器,提高VR的渲染效率,更多的大家可以查相应资料,在这,说个The Lab Renderer for Un ...

  9. Unity中Mesh分解与边缘高亮加上深度检测

    一个比较简单的需求,不过遇到些坑,记录下. 房间有多个模型,每个模型可能多个SubMesh,点击后,需要能具体到是那个SubMesh,并且在这个SubMesh上显示边缘高光,以及能个性这单个SubMe ...

随机推荐

  1. 硬盘读取不了-->>完美解决

    说明:电脑装了两个硬盘,一个固态一个机械,装完系统之后读取不到机械硬盘的数据,网上很多人都说格式化之后分盘,但是!!!里面的数据咋办?千万别自己倒腾转换格式什么的,一不小心数据真的丢了,那就再也找不回 ...

  2. hwclock

    查看.设定硬件时钟.该时钟由主机板的晶振及相关电路提供,需要主机板氧化银电池提供动力. 通过命令 hwclock 访问硬件时钟获取时间信息.该命令可以显示当前时间.重新设置时间.读取系统时间.设定系统 ...

  3. Freemarker入门

    Freemarker入门 工程引入依赖 <dependency> <groupId>org.freemarker</groupId> <artifactId& ...

  4. 4.安装mitmproxy问题处理

    上次进行到安装 证书出现问题: 1.主要原因是:对应python版本不一致 需要3.6以上的版本 才能在cmd黑窗口执行 mitmdump命令 生成证书 如图: windows 版本 双击安装 mit ...

  5. hdfs dfsadmin 命令详解

    hdfs dfsadmin [-report [-live] [-dead] [-decommissioning]] [-safemode <enter | leave | get | wait ...

  6. javascript页面刷新的几种方法

    javascript refresh page 几种页面刷新的方法 本节内容:Javascript刷新当前页面的方法与实例. window.location.reload(),window.histo ...

  7. J2SE 8的流库 --- 基本类型流的使用

    展现流的方法 public static <T> void show(String title, Stream<T> stream){ System.out.println(& ...

  8. ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql/mysql.sock' (2)

    [root@XXX ~]# mysql -h localhost -uroot -p Enter password: ERROR (HY000): Can't connect to local MyS ...

  9. Python集合的基本操作

    #-*coding:utf-8 -* list =set([2,3,4]) list2 =set([5,3,7]) #交集 #print (list.intersection(list2)) #并集 ...

  10. html 基础之canvas 和 localStorage

    1,建立一个canvas 画布: <!DOCTYPE html> <html lang="en"> <head> <meta charse ...