多版本Shader与multi_compile

 
 
#pragma multi_compile Type_1 Type_2 Type_3 ...

这个指令将会生成多个Shader变体(variants),运行时根据材质或是全局的Keyword决定哪个变体起效

所有关键字都没有起效的话, 会选择第一个起效,所以一般是写 XXX_OFF XXX_ON  默认关闭某选项

#pragma multi_compile __ FOO_ON

这种方式会少用一个关键字(总关键字数目有限制 256最大,内部已经用了大约60个)

#pragma shader_feature 和 #pragma multi_compile相似

不同的是shader_feature没有用到的不会被包含进去 multi_compile 全部版本都会被包含

所以 shader_feature 材质用 multi_compile 代码控制用

#pragma shader_feature FANCY_STUFF 是  #pragma shader_feature _ FANCY_STUFF 的缩写

shader中判断

#ifdef Type_n

... ..

#endif

在脚本里用

Material.EnableKeyword 和 DisableKeyword

Shader.EnableKeyword 和 DisableKeyword

控制keyword起效

注意: 5.4中用Shader.EnableKeyword设置了全局使用默认的key, 用Material.EnableKeywor设置单个不使用默认值无效

用Shader.EnableKeyword设置了全局不使用默认的key, 用Material.EnableKeywor设置单个使用默认值起效

EnableKeyword 和 DisableKeyword 最好组合使用 比如一组有三个,必须写1个enable2个disable

#pragma multi_compile A B C

#pragma multi_compile D E

会生成6(3*2)个变体

用上面的方式并不能根据不同的情况减少Pass,

可以用LOD属性控制SubShader的起效来手动的管理起效的Pass

把需要的基础Pass放在基础Shader中,用UsePass来组织需要起效的Pass

默认的ShaderLOD值为 200

Built-in shaders in Unity have their LODs set up this way:

    • VertexLit kind of shaders = 100
    • Decal, Reflective VertexLit = 150
    • Diffuse = 200
    • Diffuse Detail, Reflective Bumped Unlit, Reflective Bumped VertexLit = 250
    • Bumped, Specular = 300
    • Bumped Specular = 400
    • Parallax = 500
    • Parallax Specular = 600

多版本Shader与multi_compile的更多相关文章

  1. 关于Unity中GrabPass截屏的使用和Shader的组织优化

    GrabPass截屏 可以用来截屏,截屏后把纹理传给下一个通道使用. 1:使用抓屏通道, GrabPass {} 或 GrabPass { “ 纹理名称”}; 使用GrabPass {}后,可以用_G ...

  2. ShaderLab中vertex fragment类Shader基础格式笔记

    //U3D用的shader语言叫ShaderLab,基础语法官方文档地址 //https://docs.unity3d.com/Manual/SL-Shader.html //开头指明名字,可以在别的 ...

  3. Unity3d Shader开发(三)Pass(Color, Material, Lighting )

    材质和灯光参数被用于控制内置顶点光照.顶点光照是Direct3D/OpenGL标准的按每顶点计算的光照模型.光照打开时,光照受材质块,颜色材质和平行高光命令的影响. 每像素光照常被实现为自定义顶点/片 ...

  4. Unity Shader 效果(1) :图片流光效果

    很多游戏Logo中可以看到这种流光效果,一般的实现方案就是对带有光条的图片uv根据时间进行移动,然后和原图就行叠加实现,不过实现过程中稍稍有点需要注意的地方.之前考虑过风宇冲的实现方式,但是考虑到sh ...

  5. PBR工作流

    目标是让substance效果和unity效果一致 分2步: 1.完成1个shader,效果和standard完全一致,抛去不需要的功能 2.使用新的shader,在substance里替代原有的渲染 ...

  6. OpenGL ES: (4) EGL API详解 (转)

    上一节我们初步学习了 OpenGL ES.EGL.GLSL 的相关概念,了解了它们的功能,以及它们之间的关联.我们知道了 EGL 是绘制 API(比如 OpenGL ES)与 底层平台窗口系统之间的接 ...

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

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

  8. Shader Model 版本与DirectX的关系(OpenGL对应的呢?)

    http://blog.sina.com.cn/s/blog_6e521a600100q4dr.html DX9还是能支持到固定管线的,虽然说是在内部被转换成shader: DX10明确不再支持固定管 ...

  9. OpenGL10-骨骼动画原理篇(3)-Shader版本代码已经上传

    视频教程请关注 http://edu.csdn.net/lecturer/lecturer_detail?lecturer_id=440 接上一个例程OpenGL10-骨骼动画原理篇(2),对骨骼动画 ...

随机推荐

  1. When Programmers and Testers Collaborate

    When Programmers and Testers Collaborate Janet Gregory SOMETHING MAGICAL HAPPENS when testers and pr ...

  2. 链表的C++实现

      有的时候,处于内存中的数据并非连续的.那么这时候.我们就须要在数据结构中加入一个属性.这个属性会记录以下一个数据的地址.有了这个地址之后.全部的数据就像一条链子一样串起来了,那么这个地址属性就起到 ...

  3. python mmap使用记录

    1.写文件 with open('??', 'r+b') as f: with contextlib.closing(mmap.mmap(f.fileno(), size, flags=mmap.MA ...

  4. ubuntu删除文件夹

    -r表示强制删除,-f表示不提示 强制删除文件夹并提示 sudo rm -r 文件夹名 强制删除文件夹不提示 (最暴力) sudo rm -rf 文件夹名

  5. graphics基础

  6. 深入理解SP、LR和PC

    深入理解ARM的这三个寄存器,对编程以及操作系统的移植都有很大的裨益. 1.堆栈指针r13(SP):每一种异常模式都有其自己独立的r13,它通常指向异常模式所专用的堆栈,也就是说五种异常模式.非异常模 ...

  7. System.Configuration.ConfigurationErrorsException: An error occurred creating the configuration sect

    An error has occurred creating the configuration section handler for userSettings/Microsoft.SqlServe ...

  8. Intellij IDEA 14代码错误提示如何调出来

  9. not in和not exist的区别(转)

    in和exists in 是把外表和内表作hash 连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询.一直以来认为exists比in效率高的说法是不准确的. 如果查询的两个 ...

  10. Ice php配置

    1) Removed the php extension directories and recompiled apache/PHP2) Rebooted the machine.3) I remov ...