multi_pragma与shader_feature之间有所不同

时间:2016-12-13 03:52:15

标签: unity3d hlsl cg

我经历了很多文档和谷歌但仍不清楚。作为国家,在统一文档中,

pragma_multi

#pragma multi_compile A B C
#pragma multi_compile D E

这将为第一行产生三个变体,为第二行产生两个变体,或者总共六个着色器变体(A + D,B + D,C + D,A + E,B + E,C + E)

shader_feature

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;

我的问题是:

  
      
  1. 是否可以在脚本中创建枚举,只能选择上面的一个(FUNC,OTHERFUNC),然后着色器将在运行时基于该枚举进行渲染。
  2.   
  3. 如果可能,我应该使用pragma_multi还是shader_feature
  4.   

1 个答案:

答案 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");

使用适当的变体,其中"材料"是指向渲染器材质的变量。

如果要将枚举元素的名称与着色器要素名称的名称相匹配,当然可以使用枚举驱动该关键字启用。

我希望这有帮助!