当前位置:   article > 正文

UnityShader中着色器编译多样化_unity glsl worldtransformparams

unity glsl worldtransformparams

      很久没写东西了, 这些笔记是参考网上资料和自己得理解来写得,最近项目做完了才有一些空余时间,接着研究Unity着色器多样化,对于刚开始接触着色器得人,还是比较困难。自己趟两年水,我才敢说自己刚刚入门。今天主题是关于Unity着色器编译多样化。

       从Unity5系列开始采用被称为着色器编译多样化得新技术,被称为uber Shaders或者megashaders,并且通过每种情况提供不同得预处理指令来让着色器代码多次被编译来实现。

        在Unity中,这可以通过#pragma multi_compile 或者#pragma shader_feature指令来在着色器代码中实现,这种做法对表面着色器也可行。

如果我们定义:

                          #pragma multi_compile FANCY_STUFF_OFFFANCY_STUFF_ON运行时,

        其中一个将被激活,根据材质或者全局着色器关键词(#ifdef FANCY_STUFF_OFF之类的宏命令也可以)来确定激活哪一个,若两个关键词都没有启用,那么将默认使用前一个选项,也就是关闭(OFF)的选项FANCY_STUFF_OFF。

当然也可存在超过两个关键字的multi_compile编译选项,比如,如下代码将产生四种着色器的变体。

                  #pragma multi_compile SIMPLE_SHADINGBETTER_SHADING GOOD_SHADING BEST_SHADING

为嘛编辑的时候有的连写,有的不会连写。

        当#pragma multi_compile中存在所有名字都是下划线的一个指定段时,就表示须在没有预处理的情况下产生一个空的着色器变种。这种做法在着色器编写中比较常见。因为这样可以在不影响使用的情况下,避免使用两个关键词,这样就节省一个变量个数的占用。

例如,下面的指令将产生两个着色器变体,第一个没有意义,第二个定义为FOO_ON

       #pragma multi_compile __ FOO_ON

这样就省掉一个本来需要定义出来的FOO_OFF(FOO_OFF没有定义,自然也不能被使用),这样就节省了一个关键词个数的占用。

定义的意义:

如果Shader中有如上定义,则可以使用#ifdef来进行判断

#ifdef FOO_ON

//代码段1

#endif

根据上面已经定义过的FOO_ON,此时#ifdef判断的结果为真,代码段1部分的代码就会被执行到。反之,若#pragma multi_compile __ FOO_ON一句代码没交代出来,那么代码段1部分的代码就不会被执行。

shader_feature和multi_compile之间的区别

#pragma shader_feature和#pragma multi_compile非常相似,唯一区别就在于采用了#pragma shader_feature语义的shader,在遇到不被使用的变体的时候,就不会将其编译到游戏中。所以,shader_feature中使得所有的设置到材质中的关键词都是有效的,而

multi_compile指令将从全局代码里设置关键词。

当shader_feature还有一个仅仅含有一个关键字的快捷表达方式

例如:#pragma shader_feature FANCY_STUFF

此为#pragma shader_feature _FANCY_STUFF的一个简写形式,其扩展出两个着色器变体,第一个变体自然为不定义此FANCY_STUFF变量,第二个变体为定义此FANCY_STUFF变量

多个multi-compile连用会造成指数级增长

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号