ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

如何由Height Map生成Normal Map

2019-07-27 22:39:18  阅读:326  来源: 互联网

标签:Map Normal float Pos texCoord Height NormalMap float2 float3


原文链接:http://www.cnblogs.com/cxrs/archive/2009/11/01/1594155.html
       Nvidia和ATI都有相应的工具把Heightmap转成NormalMap,有了NormalMap,我们就可以用NormalMapping技术进行Per Pixel Lighting计算了。那么HeightMap是怎么转化成NormalMap的呢?
      其实并不难,在《3D游戏与计算机图形学方法》中,提供了一种由高度图生成法向图的方法。其思想是根据高度图中的象素与其周围象素的高度差,在切空间构造S向量和T向量,由SXT得到法线向量。
设H(i,j)表示在height map上(i,j)象素点的高度值,则在切线空间S和T方向的切向量可以表示成: S(i,j) = (1,0,H(i+1,j) - H(i-1,j) ) T(i,j) = (0,1,H(i,j+1) - H(i,j-1) ) Normal(i,j) = S(i,j) X T(i,j) H(i+1,j) – H(i-1,j)为沿S方向的高度差,也就是S方向的坡度,H(i,j+1) - H(i,j-1)为沿T方向的高度差,也就是T方向的坡度。当相邻象素高度差为0时,则算出的Normal(i,j) = (0,0,1),表示法线垂直于平面,当有高度差时,法线就会分别朝S方向或T方向偏移。      用shader来实现也很简单,VS和PS代码如下,上边左图为HeightMap,右图为由下面shader生成的NormalMap,这个方法生成的NormalMap并不够好,在RenderMonkey中有一个叫NormalmapFilter的Sample,会生成更高质理的NormalMap,有兴趣的朋友可以参考。 VS_OUTPUT main(float4 Pos: POSITION){    VS_OUTPUT Out;    // Clean up inaccuracies    Pos.xy = sign(Pos.xy);    Out.Pos = float4(Pos.xy, 0, 1);    // Image-space    Out.texCoord.x = 0.5 * (1 + Pos.x);    Out.texCoord.y = 0.5 * (1 - Pos.y);    return Out; }   float4 main(float2 texCoord: TEXCOORD) : COLOR {    float2 off = 1.0 / HeightMapSize;    float Scale = 1;    // Sample teh neighbor    float s0 = tex2D(Heightmap, texCoord + float2(-off.x,0)).r;    float s1 = tex2D(Heightmap, texCoord + float2( off.x,0)).r;    float s2 = tex2D(Heightmap, texCoord + float2( 0,-off.y)).r;    float s3 = tex2D(Heightmap, texCoord + float2(0,off.y)).r;    float3 U = float3(1,0,s1 - s0);    float3 V = float3(0,1,s3 - s2);    float3 normal = normalize(Scale * cross(U,V));    // Pack [-1, 1] into [0, 1]    return float4(normal * 0.5 + 0.5,1); }  
   

转载于:https://www.cnblogs.com/cxrs/archive/2009/11/01/1594155.html

标签:Map,Normal,float,Pos,texCoord,Height,NormalMap,float2,float3
来源: https://blog.csdn.net/weixin_30265103/article/details/97564773

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有