凹凸小记

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 );
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 七、物质宇宙的大小及年龄 1、从物质粒子的大小看微观宇宙有多小 ⑴物质由分子组成 在宇宙中的一切物质均由分子组成。...
    宇宙形成阅读 931评论 0 0
  • LeetCode 149. Max Points on a Line Description Given n po...
    ruicore阅读 248评论 0 0
  • 今天是第五讲了,GPS定位和选择性粘贴,因为在外出差,不方便导图,就用文字简单罗列下吧: 1.选择性粘贴的基本用法...
    Jessie1988阅读 285评论 0 0
  • 做事之前最重要的是什么?是要明确事情的目的和实现的手段。目的是希望达成的结果,手段是达到目的可以采取的方法。 读书...
    吉日良辰阅读 501评论 0 0
  • 一段时间不写一些字,总是觉得少了些什么,总想在适当的时候发发感慨,记录一下这一段时间的经历和发生的大事情。 整个十...
    气泡果阅读 167评论 0 0