1.高度贴图转法线贴图
2.多张法线贴图效果的叠加
3.法线从切线空间转世界空间
1.高度贴图转法线贴图
求出uv,u方向高度贴图数值的斜率:(u-0.5,v)的值-(u+0.5,v)的值,并将其转为切线空间的向量tu
v方向高度贴图数值的斜率:(u,v-0.5)的值-(u,v+0.5)的值,并将其转为切线空间的向量tv
因切线空间为左手坐标空间,所以cross(tv,tu),下面是我画的简图
float2 du = float2(_HeightMap_TexelSize.x * 0.5, 0);
float u1 = tex2D(_HeightMap, i.uv - du);
float u2 = tex2D(_HeightMap, i.uv + du);
float3 tu = float3(1, u2 - u1, 0);
float2 dv = float2(0, _HeightMap_TexelSize.y * 0.5);
float v1 = tex2D(_HeightMap, i.uv - dv);
float v2 = tex2D(_HeightMap, i.uv + dv);
float3 tv = float3(0, v2 - v1, 1);
i.normal =normalize( cross(tv, tu));
2.多张法线贴图效果的叠加
此方法法线叠加,而不用 相加法线再归一化 的方法,可以保证凹凸度不会受另一张贴图的影响
half3 normal1 , normal2;
half3 BlendNormal = half3(normal1.xy+normal2.xy,normal1.z*normal2.z);
3.法线从切线空间转世界空间
之前一直用冯女神书中的方法,但那个写起来很麻烦,后来看到这种方法半天没看懂(代数好菜)
后来动手算一下结果是一样的 图片如下:
//求副切线
float3 binormal=cross(i.normal,i.tangent.xyz)*i.tangent.w*unity_WorldTransformParams.w;
//看到过的最简单的代码(从切线空间转世界空间)
i.normal= normalize(
tangentNormal.x * i.tangent+
tangentNormal.y * binormal+
tangentNormal.z * i.normal );