天天看点

法线贴图中法线值的坐标空间选择

法线贴图是目前游戏中被广泛使用的技术,通过从贴图采样法线可以表现物体的凹凸,在法线贴图的实现上,有一个重要的问题需要考虑,就是法线贴图上的法线值应该取在哪个空间.

一  模型空间:法线就直接取建模时的模型空间,这是最容易想到的方法。这种方法在runtime的时候,将光线从世界坐标转换到模型的局部坐标,然后在局部空间同每个pixel的采样到的法线做光照计算。这种方法有个最大的缺点就是法线贴图需要的是唯一化的uv(即模型的每个顶点的nv都不能重复,为什么?想象一下即可,模型需要完全展开到发帖上),这意味着法帖的尺寸较大,不能复用,占内存。

二切线空间:首先切线空间的定义,模型顶点处,以顶点的法向为z轴,模型的局部y轴方向为y轴,用他们叉乘出x轴,在用x和z叉乘出新的y。这样建立的坐标系是和这个点的法向相切的,这个空间叫做正切空间,这个坐标系的数值表示称为改点的正切值,通常和位置uv等其他一并放入顶点buff里。切线空间法线的做法是将某点的法线转换到该点的正切空间上,存储正切空间的法线值。因为正切空间的法线表征了相对这点的凸起情况,所以法帖是可以在模型的不同位置重用的,比如可以平铺何以对折,可以某些部位重用。在runtime计算的时候,要讲光线转换到正切空间计算。节省了贴图的内存,但是要附加顶点的正切属性。这是目前较为流行的法线计算方法。