UnityShader开发之纹理 - 法线

1.概念

        凹凸映射一般是在需要表现模型的精致,又不希望使用过多的三角面进行光照渲染的场景中使用。

        有两种主要的方法来进行凹凸映射:一种是用高度纹理(height map)来模拟表面位移,然后得到一个修改后的法线值,这种方法也叫高度映射(height mapping);另一种方法则是用一张法线纹理(normal map)来直接存储表面法线,这种方法被称为法线映射(normal mapping)。

2.法线映射

        一张二维的纹理通常有u轴和v轴,当他们在拥有一个h轴时,它就是一个三维的物体了,而我们通过高度值h来做这个影响因子,通过进行乘积来做图像增强。

    2.1 法线贴图生成

         目前法线贴图所依赖的高度h通常由图片的灰度值图生成,灰度值C_{result}通常使用公式:C_{result}=C_{origin}.r*0.2126+C_{origin}.g*0.7152+C_{origin}.b*0.0722来获得。

        可以将获得的灰度值当成高度值。则函数f_{(u,v)}=SampleGray_{(u,v)},即对灰度值采样。

        曲线的变化趋势仍可以用过曲线上一点的切线的斜率即 导数来描述。导数的几何意义是该函数曲线在这一点上的切线斜率。

        则在u方向上的切线的斜率f'_{Slope_u}=\lim_{\Delta u \to 0}\frac{f(u+\Delta u)-f(u)}{\Delta u}

       设f_{(u)}=f'_{slope_u}*u,则当u=1时,得到切线向量(1,f'_{slope_u})

        当多加一维v后:

       

       所以u方向的切线为tangent_{u}=(\Delta u,0,f(u+\Delta u)-f(u))

       同理v方向的切线为tangent_{v}=(0,\Delta v,f(v+\Delta v)-f(v))

       所以v方向在世界坐标中的切线为normal=tangent_{u}\times tangent_{v}

        由于法线的取值区间为[-1,1],所以,想要将法线保存到一张法线贴图中是需要进行映射的,映射公式为C_{pixel}=\frac{(normal+1)}{2}

        将模型本地空间中的顶点所对应的法线通过上方公式计算得到的像素值存在一张图内,即为模型空间下的法线纹理

        

    2.1 法线贴图的使用

        上一步我们求得的法线,是在切线空间中的,这个时候需要将模型空间转换到世界空间,再与光照分量进行点乘。

参考博客:

https://blog.csdn.net/qq_26900671/article/details/79048727

https://blog.csdn.net/lzhq1982/article/details/75212518

http://gad.qq.com/article/detail/288865591167

猜你喜欢

转载自blog.csdn.net/qq_28474981/article/details/84980181