先说结论: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也不是很熟悉,只是实验出来了这一种方法勉强可以使用,要是有大佬有解决办法,希望可以指教一下
前人栽树后人乘凉,乘凉之后也要记得栽树哦。