icrdr吧 关注:11,725贴子:289,717
  • 25回复贴,共1

【知识解析向】光影材质包里面的法线贴图到底是个啥

只看楼主收藏回复

┝━━━┥前言┝━━━┥
关于贴吧里面对于光影的研究热爱,我是十分佩服支持的,但是这些帖子不是挖坑不填,就是没能解析清楚光影材质包里面那个法线贴图是个什么玩意。
所以我开了这个帖子想要科普一下法线贴图到底是个啥。希望发完这个帖子以后该更新用法的赶紧更新用法,该填坑的赶紧填坑,我手机打这么多字也挺不容易的。
┝━━━┥不算入门的入门┝━━━┥
想要了解法线贴图是什么,就需要了解法线是什么。在物理学上,法线被定义为垂直于一个平面的一条线,入射光和反射光关于这条法线对称,与这条法线的夹角相等。那么说,只要自动入射点和光线与法线的夹角,就能计算出反射光的角度了。渲染器完全忠实于这个反射定律,渲染中靠的就是入射点的位置和光线与法线的夹角确定光照效果。
┝━━━┥法线贴图的入门┝━━━┥
于是法线贴图应运而生。用屁股想都知道,法线贴图是用来记录物体表面不同的入射点的法线的图像数据信息。但是法线贴图是如何记录的呢?
对于高中的朋友来说各种矢量应该不陌生。立体矢量就是在一个空间内用一个点的坐标确定一条线的大小,这条线就是这个点到坐标轴原点的连线,因为这个点到坐标轴原点的线仅有一条,所以可以确定一条线。法线贴图是用一个RGB彩色图像来记录不同点的法线XYZ坐标数据的。规则是R通道记录X轴的数据,G通道记录的是Y轴数据,B通道记录的是Z轴的数据。
┝━━━┥法线贴图的种类┝━━━┥
没错这里我复制我很推崇的一位老师(数字人老师)的博文的。(看过的可能会记得)博文的地址我在结尾发。
法线贴图的英文名:normalmap
1、world space normalmap:如果这个法线方向,是处于世界坐标中的(world space),那称为world space norma。渲染器从贴图里解压出来后,就可以直接用了,效率很高。但是有个缺点,这个world space normal 是固定了,如果物体没有保持原来的方向和位置,那原来生成的normal map就作废了。
2、object space normamap:如果是处于物体本身局部坐标中的,那称为object space normal。它从贴图里解压,还需要乘以model-view矩阵转换到世界坐标,或者转换到其他坐标取决于计算过程及需求。object space normal生成的贴图,物体可以被旋转和位移,基本让人满意。但仍有一个缺点,就是一张贴图只能对应特定的一个模型,模型不能有变形(deform)。
3、tangent space normal map:
在object space的基础上,高模上object space内的某点法线(不会是world space的,否则旋转就露相),乘以这个矩阵,即得到tangent space内的法线方向,再把这个值映射到rgb空间,存为贴图。
这里我主要重新讲一下这第三种贴图。按照法线贴图的入门里面讲的,用三色系表示坐标,因为法线的不确定性,坐标应该也是不确定的,那么法线贴图的颜色也应该是花花绿绿的什么颜色都有。那为什么从光影材质包里面解压出来的贴图都是偏蓝色的呢?
实际上光影材质包里面的法线贴图都是第三种法线贴图,这种法线贴图的特点就是偏蓝。原理通俗一点说就是这种法线贴图的RGB三色不再直接表示这个点的坐标,而是表示这个点与其他点的法线偏移程度。这种贴图里面的坐标轴不再是单纯的根据世界轴或者中心轴的xyz来定义,而是根据一个标准法线和这个点的uv坐标定义一个坐标轴,在视窗中如果显现出来的话这个坐标轴就不一定是我们想象中的样子。这样的话这个法线贴图就不会因为形变而失效,因为形变并不会改变这个点的uv坐标,它还是对应着材质上原来的那一点。因为这种法线贴图的实质是表现这个点与周围的点的法线差异,而对于高模来说,每个点对于周围的点的改变都可以很小,反应到法线差异上就可以说法线和法线之间在z轴上很靠近,而z轴在法线贴图上被记录在蓝色通道(B通道),所以这种贴图的颜色就会偏蓝。
┝━━━┥无聊的后记┝━━━┥
首先是我参考的资料。
http://digitalman.blog.163.com/blog/static/238746056201623103735832/
还有一个是
https://www.zhihu.com/question/23706933/answer/25591714
还有
http://m.blog.csdn.net/article/details?id=52745524
--------来自lumia的猥琐客户端。


IP属地:上海来自WindowsPhone客户端1楼2017-02-10 21:19回复
    自古二楼艾特人。
    @夏月蝉歌one
    @酱油瓶家的水表
    还有数字人老师。
    @zahmail2046
    欢迎任何人指出其中错误。

    --------来自lumia的猥琐客户端。


    IP属地:上海来自WindowsPhone客户端3楼2017-02-10 21:23
    收起回复
      2025-08-29 15:27:03
      广告
      不感兴趣
      开通SVIP免广告
      也是看的数字人,当时刚入门看不懂。。。


      4楼2017-02-10 21:27
      收起回复
        你也来啊。看来我上回说成第二种了,好在其它没说错。


        IP属地:湖北来自手机贴吧8楼2017-02-10 22:12
        收起回复
          首先我来回答一下@0x_MB_x0 的问题。
          关于光影和c4d哪个更真实的问题,我有100%的把握说c4d比光影真实多了,因为c4d是根据物理编写的算法,而光影单纯是影子就很不真实(锯齿),c4d有时不如光影这个是因为人而不是软件不行。c4d中的参数决定了c4d的效果,不擅长不会的人自然调得很烂。
          第二个问题:c4d和法线贴图的问题。因为c4d用了光影的法线贴图之后确实不怎么样(我没试过),原因我猜想可能是这些:
          1.c4d支持三种不同的法线贴图,但是c4d并不会分析你给它的到底是什么法线贴图,如果用其他贴图的算法去计算第三种贴图当然就南辕北辙,效果自然就很垃圾。
          2.光影的法线贴图带有独特性,需要配合独特的设置才能使用,而c4d偏偏没有这个设置。这就好像拖拉机的轮子不能安装在跑车上(我觉得这个可能性较小)
          第三个问题:法线贴图的算法这么复杂游戏是怎么做到即时演算的。
          首先我们要明确一点,cpu和gpu(显卡)的差别很大。这俩东西分析到最后都是芯片组,不过cpu的芯片组在制造的时候就有很多专门用于计算函数什么的芯片组,而gpu的芯片组更加偏向计算图像,甚至有专门用于计算法线贴图的半导体集。也就是最近几年gpu才开始有一些通用型计算能力(辅助cpu运算,比方说nvdia的PhysX物理引擎),以前gpu的全部芯片都是为了图形图像优化的。更何况法线贴图的运算本来就不是特别复杂,cpu计算法线贴图时用的是模拟算法,用130点性能才能发挥显卡100点性能的对应能力。综上所述cpu分析法线贴图不行很正常。
          (字太多了我分一层讲)
          --------来自lumia的猥琐客户端。


          IP属地:上海来自WindowsPhone客户端9楼2017-02-10 22:37
          收起回复
            大赞lz


            IP属地:广东11楼2017-02-12 13:18
            回复