正常情况下,Shader的变体会导致Shader变体爆炸,文件很大。

  比较常见的做法是,mat和shader在同一个地方打包,使得mat只使用这个版本的shader变体,不过这样每个shader变体是独立存在的,如果有多份mat引用了同一种变体版本,这个变体版本实际上会有多份(?这里只是猜测,待考证);另一个方法是使用SVC,不过这个很容易出粉,运行时粉了就不太好查了。

  下面有一个在编译时就完成的变体方案。

  对一个AllInOne的大Shader,在重写Shader的自定义编辑器,使得美术使用的时候,点一下Shader变体优化按钮,就自动产生一份对应KeyWord枚举的新的Shader变体(已经存在就直接读取),用二进制来表示各个关键词有无即可;同时,使用者在使用时可以来回切换来保证增删新的KeyWord,只要编辑完了点一下产生变体优化即可,这样就把这个问题提前到编译时了。

  甚至使用者可以不点,打包前批处理也是可以的。

  产生新的小变体Shader的原理是利用关键词建立上下文,然后用简单的AST去做语法分析产生新的Shader代码即可。