Interpolation Across Triangles: Barycentric Coordinates
三角形上的插值:重心坐标
为什么需要插值法?
三角形的三个顶点有特定的值(颜色,法线,材质...),我们想得到三角形中任意一点的特定值,使得三角形中该值均匀变化
重心坐标Barycentric coordinates (α,β,γ)(\alpha, \beta, \gamma)(α,β,γ)
在三角形中,与三角形共面的任意一点(x,y)(x, y)(x,y)可表示为三个顶点坐标的线性和,即(x,y)=αA+βB+γC(x, y) = \alpha A + \beta B + \gamma C(x,y)=αA+βB+γC
且满足α+β+γ=1\alpha + \beta + \gamma = 1α+β+γ=1
三角形内一点(x,y)(x,y)(x,y)满足重心坐标的三个参数均为非负数
我们将每个顶点的特定值与对应重心坐标相乘并相加 得到三角形内一点的特定值
注意!点在三角形内的重心坐标在投影后可能发生变化 
几何上,αβγ\alpha \beta \gammaαβγ的值为顶点对应三角形占三角形ABC的比值

三角形面积由向量的叉积求得,如PA叉乘PB向量的模为三角形PAB面积的两倍
重心坐标结果如下
α=−(x−xB)(yC−yB)+(y−yB)(xC−xB)−(xA−xB)(yC−yB)+(yA−yB)(xC−xB)\alpha = \frac{-(x - x_B)(y_C - y_B) + (y - y_B)(x_C - x_B)}{-(x_A - x_B)(y_C - y_B) + (y_A - y_B)(x_C - x_B)}α=−(xA−xB)(yC−yB)+(yA−yB)(xC−xB)−(x−xB)(yC−yB)+(y−yB)(xC−xB)
β=−(x−xC)(yA−yC)+(y−yC)(xA−xC)−(xB−xC)(yA−yC)+(yB−yC)(xA−xC)\beta = \frac{-(x - x_C)(y_A - y_C) + (y - y_C)(x_A - x_C)}{-(x_B - x_C)(y_A - y_C) + (y_B - y_C)(x_A - x_C)}β=−(xB−xC)(yA−yC)+(yB−yC)(xA−xC)−(x−xC)(yA−yC)+(y−yC)(xA−xC)
γ=1−α−β\gamma = 1 - \alpha - \betaγ=1−α−β
Applying Textures
对屏幕上的每个采样点(x, y) (通常是像素中心)
插值法找到对应的材质坐标(u, v)
将采样点的颜色设为对应材质的颜色
Texture Magnification
当材质分辨率较低,而实际分辨率较大时,会出现纹理放大texture magnification
在采样(x, y)时,常规做法是用最近的texture上的点近似代替,这会导致多个邻近的采样点使用相同的颜色,导致纹理放大
纹理上的像素称为纹理元素texel
双线性插值Bilinear Interpolation 可解决纹理放大
e.g. 双线性插值 取邻近的四个texel,在u, v方向上分别做线性插值
四个黑色texel先在u方向上线性插值得到u1, u0
再做线性插值得到红色采样点的颜色值
(这里的公式假设两个相邻黑色texel的距离为1,便于计算)
Texture Minification
当材质分辨率较大,而实际分辨率较小时,会出现纹理缩小Texture Minification
一个采样点对应到纹理空间上,覆盖范围footprint包括texture上的多个texel

解决方法:Mipmap 实现快速、近似、正方形的 范围查询
将texture提前处理,从level 0原分辨率128x128开始,存储level 1,level 2...level N的图像,图像分辨率边长每次缩小为原本的一半
多消耗原texture三分之一的存储空间

对于每次采样,通过相邻像素在纹理空间中的坐标差来估算footprint的大小
将当前采样点得到的覆盖范围近似为边长为L的正方形
通过边长L找到在mipmap中对应的level D ,即D=log2LD = log_2LD=log2L,然后使用对应level D的提前处理的texture进行着色

如果处理出来的level D不是整数呢?
采用三重线性插值Trilinear Interpolation
先在与D相邻的两等级的texture上,对采样点周围四个texel使用双线性插值
再将两个结果按D的小数结果进行线性插值
floor(D) + ceil(D) --------linear interpolation--------> D
mipmap的限制:各向同性带来的倾斜,长条形footprint,会导致overblur

解决方法:各向异性过滤Anisotropic Filtering
提前处理texture时,对于mipmap的每个等级的图像,固定图像分辨率长度不变,宽度为原来的一半,1/4...;宽度不变,长度为原来的一半,1/4...
这样在查询时可以得到轴对齐的矩形区域
对采样点近似时,部分矩形覆盖范围不必近似成大型正方形,而能直接查询到对应的矩形

但各向异性过滤对于倾斜的矩形覆盖范围的采样点优化仍然有限
可采用EWA filtering:多次查询,加权平均,可处理不规则覆盖范围