reference: 《Mathematics for 3D Game Programming and Computer Graphics》
目录
1.标准纹理映射 2.投影纹理映射 3.立方体纹理映射 |
为了获得更真实的细节,一张或多张纹理映射将会应用到物体的表面,正如下图所显示的。物体表面上每一点的纹理像素都能在纹理映射中找到,它们遵循光照公式以某种方式与光照结合在一起。在最简单的情况下,一个从漫反射纹理映射得到的样例可以用于调节漫反射的颜色。本章之后还会探讨更多高级应用。
让颜色T代表表面上一点对应的纹理映射中的过滤样本。使用这个颜色来调节漫反射颜色将会产生漫反射光照方程的扩展版本:
正如纹理映射可以用于调节光照方程中的漫反射部分一样,我们也可以使用纹理映射来调节镜面反射。这样的一个纹理有时被称作高光贴图(gloss map),它决定了表面上每一点的镜面光泽程度。使用颜色来表示高光贴图中的一个过滤样本,我们可以这样扩展镜面反射方程:
(注:镜面反射光照方程为:)
从纹理映射得到的样本真实颜色决定于其对应的物体纹理坐标。纹理坐标要么是预先计算好的,存储在三角形网格的每个顶点中,要么是在运行时计算来产生一些特殊效果。在渲染三角形面片的的时候,纹理坐标使用公式
来进行纹理坐标的插值。对于纹理图的每个顶点而言,可能有1到4个坐标,它们被标记为s,t,p和q。接下来的几个章节将会介绍几种不同的纹理映射,以及每种纹理映射中,我们如何使用纹理坐标在纹理映射中找到对应点。
在一,二或三维的纹理映射,我们使用对应的纹理坐标来查找纹理像素。正如下图所显示的,纹理映射的整个宽度,高度以及深度分别对应着s,t以及p方向0到1之间的坐标值。
一个一维的纹理映射可以被看作一个只有单一高度方向像素的二维纹理映射。同样地,一个二维的纹理映射可以被看作是一个只有单一深度方向像素的三维纹理映射。如果t和p坐标没有被特别标注,那么我们就认为它们为0。
第四个纹理坐标将在投影纹理映射中使用,它的应用将在这一部分介绍。q坐标值和齐次坐标中的w非常类似,在没有特别说明的情况下,它的值一般是1。坐标s,t,p的值将除以q的坐标值。对于一个两个端点纹理坐标分别为(s1,t1,p1,q1)和(s2,t2,p2,q2)的扫描线,我们可以使用方程
来计算内插值s3和q3,其中含中间参数这两个值的商给出了纹理映射样本中的s坐标:
类似的表达式可计算出投影的t,p的纹理坐标。
一些投影坐标映射是点光源投影周围环境图像的模拟,正如下图所显示的,图像的投影随着与点光源的距离增大而增大。这样的效果是由使用一个4X4的矩阵把物体的顶点位置坐标映射到纹理坐标(s, t, 0, q)上得到的,这样再除以q,就能产生正确的投影图像的2D纹理映射坐标(s,t)。
假设处在P点的点光源朝向为Z。让单位向量S和T处在与向量Z垂直的平面上,让它们与投影纹理图像所处的s,t坐标方向重合。点光源照射的表面上的每个顶点位置(x,y,z,1)首先必须被转换到以点光源为原点的坐标系统中,其中x,y和z坐标对应着S,T和Z向量的方向。使用列为向量S,T,Z和P的矩阵的逆可以实现这一点。如果向量S和T是相互垂直的(i.e.,投影图像不是倾斜的),那么变换可以写作:
(注意这个矩阵转换到了左手坐标系,因为S X T = - Z)
现在,我们需要用第二个矩阵来乘以上面这个矩阵,来完成投影。正如我们定义视角平截体的焦距一样,我们以顶端夹角a的形式来定义点光源投影的焦距:
令a为纹理映射的纵横比,这等价于它的高度除以它的宽度。每个顶点位置都需要被投影到与点光源距离为e的平面上,在这里我们想要把x方向处在[-1,1]区间的点映射到[0,1]上,以及把y方向上处在[-a,a]范围的点映射到[0,1]上。这个矩阵
完成了这样的映射,并且在s,t坐标除以q后完成了投影的过程。结合前面给出的两个矩阵(M1M2),我们可以用矩阵M = M2M1来推出投影点光源图像。
另外一种映射物体纹理的方法是通过使用立方体纹理映射完成的。立方体纹理映射经常用于在模型表面近似环境光的反射。如下图,立方体纹理映射包含了六个二维成分,它们分别对应着立方体的六个面。s,t和p坐标表达了从立方体中心发出的指向样本像素的方向向量。
样本对应哪一个面取决于绝对值最大的坐标的符号。另外两个坐标将除以最大的坐标值,然后利用下面这张表重新映射到[0,1]范围内,以产生2D纹理坐标(s',t')。这个坐标将用于对相应的立方体纹理映射面采样二维纹理映射,下图显示了立方体映射坐标和对应的六个面的朝向。
纹理坐标和立方体纹理映射的结合通常是在运行时产生的。例如,环境映射可以通过计算相机方向的反射并把它来存储到三角形网格每个点的(s,t,p)坐标来实现。反射方向的计算一般是在硬件中完成的,所以这可以非常高效的完成。
立方体纹理映射在一些图形硬件中的应用是标准化向量。一个标准化立方体映射,是一个在六个面存储按RGB颜色编码的向量组,而不是存储颜色图像的立方体纹理映射。它存储的向量数组的形式如下:
立方体映射中,存储在每个面像素点的向量,是像素采样的单位长度向量(s,t,p)。标准化立方体映射的使用在执行一些每像素光照时非常合适,因为在三角形表面进行法线插值,可以产生一些长度小于1的法线向量。