unity动态修改texture type解决办法 -> 修改shader使用普通纹理作为法线贴图使用

先说结论:unity不能动态的修改texture type,可通过修改shader来达到使用普通纹理用作法线贴图来达到效果

(可使用UnityEditor名空间下的函数修改,这和我们需要的构建后动态修改不符)

前提: 最开始遇到一个需求,需要下载贴图资源到项目里(webgl项目需要控制资源量),使用jslib文件下载图片赋值到材质上
问题: 下载的图片不能动态修改为法线贴图,导致效果不对
解决: 查了很久结论就是unity不让动态修改texture type,所以我们选择通过修改shader来直接使用普通纹理
修改前代码:

o.Normal = UnpackScaleNormal( tex2D( _BumpMap, uv_BumpMap ), ( _NormalScale * ( 1.0 - SpecularMask14 ) ) );

修改后代码:

float3 normal;
normal.xy = tex2D(_BumpMap, uv_BumpMap).xy * 2.0 - 0.5;
normal.xy *= 1 - SpecularMask14;
normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));
o.Normal = normal;

解析: 不使用UnpackScaleNormal函数和UnpackNormal函数,这些函数大概是把法线贴图的rgb是(0,1)的范围转化为(-1,1)使用,所以是 *2-1 的操作,但是发现光照的位置不对了,经过实验 *2-0.5 光照基本上对劲了(但是整体高度会变低,没有办法了,只能大体上还原)。这里还做了一步使用Specular贴图去掉一部分的法线贴图的效果(_NormalScale作用没办法还原了)

后记: 我对shader也不是很熟悉,只是实验出来了这一种方法勉强可以使用,要是有大佬有解决办法,希望可以指教一下

前人栽树后人乘凉,乘凉之后也要记得栽树哦。

  • 7
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值