博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
多版本Shader与multi_compile
阅读量:6805 次
发布时间:2019-06-26

本文共 1345 字,大约阅读时间需要 4 分钟。

hot3.png

 

#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

转载于:https://my.oschina.net/u/918889/blog/1858666

你可能感兴趣的文章
IO inputStream和outputStream
查看>>
1.腾讯微博Android客户端开发——OAuth认证介绍 .
查看>>
【JAVA笔记——道】JAVA对象销毁
查看>>
ORACLE物理存储结构
查看>>
markdown笔记
查看>>
Groovy 读书笔记
查看>>
求组合算法-----m个元素中选n个
查看>>
Http协议
查看>>
再发一次flash图片上传
查看>>
SQL SERVER LEAD AND LAG FUNCTION
查看>>
USACO 3.3 游戏
查看>>
我的学术诚信与职业道德
查看>>
SpringMVC之文件下载
查看>>
python中的zip()函数和map()函数
查看>>
Hbase0.98.0完全分布式搭建---【使用外部zookeeper】
查看>>
JS改变 HTML 样式(CSS)、display(显示或者隐藏元素)
查看>>
datable
查看>>
String类
查看>>
Linux主要shell命令详解(中)
查看>>
放到 子线程里面,就不卡了,
查看>>