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

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

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

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

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

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

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

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

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值