凹凸小记

作者: 万里_aa3f | 来源:发表于2019-01-14 19:42 被阅读2次

    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 );
    

    相关文章

      网友评论

        本文标题:凹凸小记

        本文链接:https://www.haomeiwen.com/subject/wzbjdqtx.html