我经历了很多文档和谷歌但仍不清楚。作为国家,在统一文档中,
#pragma multi_compile A B C
#pragma multi_compile D E
这将为第一行产生三个变体,为第二行产生两个变体,或者总共六个着色器变体(A + D,B + D,C + D,A + E,B + E,C + E)
pragma shader_feature与#pragma multi_compile
非常相似,唯一的区别是shader_feature
着色器的未使用变体不会包含在游戏构建中。
但是对于shader_feature,我真的不明白。
我尝试实现的是我的着色器使用基于枚举的特定函数。
假设我有2个功能如下。我只想要One of them is use
。
fixed4 finalColor = fixed4(0,0,0,0);
#if FUNC
finalColor = Func(renderTex, newTex);
#endif
#if OTHERFUNC
finalColor = OtherFunc(renderTex, newTex);
#endif
return finalColor;
我的问题是:
- 是否可以在脚本中创建枚举,只能选择上面的一个(FUNC,OTHERFUNC),然后着色器将在运行时基于该枚举进行渲染。
- 如果可能,我应该使用
醇>pragma_multi
还是shader_feature
?
答案 0 :(得分:2)
可以从脚本中启用某些变体,实际上这就是你拥有multi_compile指令的原因。您可以使用以下命令编辑着色器:
#pragma multi_compile FUNC OTHERFUNC
或:
#pragma multi_compile __ OTHERFUNC
为了保持安全,不受关键字限制(Unity对运行时使用的全局关键字数量有限制)。在第二种情况下,着色器将使用未定义任何内容的变体和包含OTHERFUNC的另一个变体进行编译。如果您正在使用此案例,请从着色器代码中删除FUNC测试并仅使用OTHERFUNC:
fixed4 finalColor = fixed4(0,0,0,0);
#if OTHERFUNC
finalColor = OtherFunc(renderTex, newTex);
#else
finalColor = Func(renderTex, newTex);
#endif
return finalColor;
然后,在您的脚本代码中,只需使用类似:
material.EnableKeyword("OTHERFUNC");
使用适当的变体,其中"材料"是指向渲染器材质的变量。
如果要将枚举元素的名称与着色器要素名称的名称相匹配,当然可以使用枚举驱动该关键字启用。
我希望这有帮助!