unity shader 技术从入门到放弃shaderUnity Shader分享

凹凸小记

2019-01-14  本文已影响2人  万里_aa3f

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 );
上一篇下一篇

猜你喜欢

热点阅读