Unity对法线贴图类型处理的坑及相应产生的Shader编写规范

有的时候我们会把法线贴图压缩为RG两通道,以复用BA通道存储别的信息。

这种情况下我们需要把法线贴图以

Default类型存储,而不是Normal Map类型

然而,Unity有一个潜规则,对于Shader中定义了属性名称为_BumpMap、_NormalMap、_DetailBumpMap、_DetailNormalMap的材质球,凡被拖到这4种材质球上相应的贴图框内的贴图,均会被引擎判定为法线贴图——参见引擎源码BumpMapSettings.cpp中的PerformBumpMapCheck函数。而这些材质球在被导入(Import)时会触发弹出框询问用户这类被引擎认定的“法线贴图”的Texture Type没有被“正确”标记为Normal map,是否要修复。如下图所示:

Unity对法线贴图类型处理的坑及相应产生的Shader编写规范_第1张图片

对于这类情况,我们一般是点击Ignore来无视它,然而,Unity还有一条潜规则:在以BatchMode运行的情况下并不会弹出这个交互式界面进行询问,而是直接强制将贴图的Texture Type改为Normal Map,产生不符合我们预期(需求)的结果。相关逻辑详见引擎源码BumpMapSettings.cpp中的PerformUnmarkedBumpMapTexturesFixing,这个函数中有个条件分支,如果是BatchMode或者SilentMode,强制处理(为啥不是不做处理?管得太宽了吧。。。),否则的话弹框询问。

那么,这个坑要如何回避呢?其实,简直不要太简单,就是对于有上述通道压缩需求的Shader,其中用于法线贴图的属性(Properties中定义),不要叫上述4个名称中的任何一个,哪怕你就是叫_NormapMap0,也不会触发这个潜规则。对的,就是这么简单。谁让爹妈给你起了个屏蔽字名字呢?活该你的名字没有机会出现在网路上,赶紧改名吧。

最后,总结一条Shader编码规范:对通道作用进行了重定义的法线贴图的自定义Shader,在命名该贴图的属性(变量)名称时,不要使用_BumpMap、_NormalMap、_DetailBumpMap、_DetailNormalMap这四个名字,除此以外都可以。理由见上文。

你可能感兴趣的:(Unity)