天空盒子
天空盒子实质上就是一种纹理技术。我们通过之前的一些渲染过程,可以让空间中的一些模型投影到屏幕上。但是我们可能无法让视线中充满模型。
比如在草原中,可能有一些羊,蒙古包,湖等等场景,但是我们没有办法模拟一望无际的天空模型,草原模型。所以解决方法是直接通过纹理贴图技术,定义好确定的纹理,因为我们不会在意天空的变化,同时我们保证了屏幕上的每一个像素总有颜色,总有场景可以看到。
该纹理是三维纹理,可以是正方体或者球体等等。纹理随着摄像机移动,称为封闭纹理,可以想象一下纹理盒子将空间围了起来。
为什么是三维呢,因为贴图的过程中,纹素的选择是基于空间坐标的。拿正六面体来说,有xyz三维坐标,选择最长维度离的最近的正方体那一面,我们在其2D图片中选择纹素。这样一个坐标对应两个面,一共有6个面。
法线贴图
我们可以通过插值计算法线来让三角形片元内部的像素亮度看起来有一个过渡。但是如果是粗糙的表面,虽然插值可以让亮度有一个过渡,但是也相对的平滑,无法满足表面的粗糙感。
纹理贴图是通过像纹理贴图一样,我们把法线提前存储起来,然后根据纹理坐标的位置,因为都是一样的点,那么在法线贴图中的法线坐标应该是一样的。
我们最后需要把法线转换到世界坐标系中,因为法线用于计算光照,光照要考虑很多因素,都会在世界坐标系中进行。比如法线是相对于表面向上的,但是这个表面是向下的,所以法线的方向应该是世界坐标系中朝下的方向,如果我们不使用坐标系的变换,那么法线向上,比如表面是桌子下面,结果计算的余弦值大于0,太阳可认为可以照射的到,这就产生了错误。
总之,法线贴图的目的是为了解决表面粗糙程度的,而不考虑它对于物体和光源的位置关系。所以我们要计算需要经过将法线转换到世界坐标系的过程。
之前在摄像机坐标系的方法是一样的,我们求的转换矩阵,实质上就是法线的局部坐标系,定义为TBN。具体计算方法有时间会补充。