1 Barycentric Coordinates(重心坐标)
为了做三角形内的插值,需要引入一个概念:重心坐标。
为什么要在三角形内做插值?
因为很多时候我们知道三角形顶点上的值,希望在三角形内部做平滑的过渡。
想要插值得到什么?
贴图坐标,颜色,法线...
所以,想要做插值就引入了重心坐标。

在三个点A、B、C的组成平面内的任意一点(x,y),都遵守上图中的式子。而如果想再满足找个点在ABC组成的三角形内,则需要它们都为非负数并且相加为1。也就是说,一个三角形内的点若满足上图两个式子,则它的重心坐标为:
![]()
举个例子,A的重心坐标:

重心坐标的另一种定义,面积:

α = Aa的面积/三角形总面积。β = Ab/三角形总面积。同理γ。而由此定义我们可知三角形自己的的重心的重心坐标为(1/3,1/3,1/3):

而由此,三角形内任意一个点的重心坐标也可以求出来,那也可以根据重心坐标做各种插值了。
2 Applying Textures

简单的纹理映射就是在屏幕上做采样的时候根据每个采样点的UV去取贴图上的一个颜色,采样点(顶点或者是经过类似MSAA后的采样点)之间利用重心坐标插值得到三角形内的每个点的UV,取贴图上的颜色,最终完成。
但是简单的这么做是有问题的,第一个问题就是:
Texture Magnifacation-EasyCase:
纹理太小

简单来说就是模型精度过高,贴图分辨率过小的问题。这样一来就会出现采样点取到的纹理上的坐标它不是整数:

那第一种办法Nearest,就是四舍五入,取临近的一个点的颜色,这样就是上面第一个图的效果,一块一块的颜色都是一样的。
第二种办法Bilinear,利用相邻四个点进行线性插值,效果是第二个图,质量还是差点:

第三种办法Bicubic,取周围16个点插值,效果最好。
Texture Magnifacation-HardCase:
纹理太大,问题:

这种现象产生的原因是由于越近处的物体在屏幕上对应的一个像素所覆盖的纹理越小;而远处一个像素所覆盖的纹理越大。(其实就是由于透视投影近大远小的机制,远处在屏幕上占的面积非常小)
而现在发生的这种现象之前也见到过,也就是走样。走样的原因之前说过,是由于信号变化的过快而采样的速度跟不上,那对应在这个问题上就是一个像素所包含的纹理过大,这之中的变化过多。所以想要解决这个问题,我们可以用超采样:

一个像素的结果用512次采样的结果取平均,完美解决了这个问题。但是这样一来,算法又过于复杂。所以这里用另一个思路解决,那就是范围查询,假设可以直接知道采样的这个范围的平均值,就解决问题了。这里引入一个概念:

mipmap就是由一张图生成一组图:

如何利用mipmap去做范围查询?
首先,根据屏幕上一个像素可以求出对应在纹理上的一个正方形的边长:

假设这个正方形区域边长为1,也就是一个像素,就可以知道这个区域在mipmap的第0层就是一个像素。假设边长为4,那么就可以知道这个区域在mipmap的第2层上是一个像素。这时候我们就可以根据对应的UV坐标去找到这个区域它的颜色。
所以如此一来,在三维空间中我们就可以划分出mipmap的等级:

越近的地方,mipmap等级越低。
然而这样也会有一个问题,就是mipmap没有小数级别,只有0层1层,不存在0.5层,所以这样一来在三维空间中就会产生突变。
那么想要解决它,使用插值就可以了。三线性插值:

在同一层中,我们使用了水平和竖直的双线性插值解决了Texture Magnifacation的问题,而在mipmap的不同层之间,再进行一次插值,便是一个三线性插值。
经过插值之后,三维空间中的mipmap等级就变得很平滑了:

然后我们再回到上面说的走样的问题:

假设经过超采样以后的效果是正确的,那么我们使用mipmap技术再来看一下效果:

发现效果不太对,远处的变糊了,我们称这种现象叫做Overblur。也就是模糊的过分了。那肯定是mipmap出了问题,问题的一种情况如下:

屏幕上的一个正方形映射到纹理中,其实不是一块正方形了,这时候若是按照mipmap的思路使用正方形去近似范围均值就会出现过分模糊的问题。而这时候我们使用了另一项技术:各项异性过滤,不再使用正方形,而是使用矩形区域去做近似,效果会好很多:

各项异性过滤:

但是各向异性过滤也不是最好的方式,可以从上上张图最左上角的形状看到,就算使用矩形区域去近似,也不是最完美的。
EWA过滤:
