双线性纹理筛选

双线性筛选 计算最接近取样点的 4 个纹素的加权平均值。 与最近点筛选相比,此筛选方法更加准确和通用。 此方法很有效,因为它是在现代图形硬件中实现的。

示例

纹理始终是从左上角的 (0.0, 0.0) 向右下角的 (1.0, 1.0) 进行线性寻址的。 纹理的线性寻址如下图所示。

使用固态色块的 4x4 纹理的图示

纹理通常看似由固态色块构成,但实际上应将纹理视为等同于光栅显像才更为准确:每个纹素均定义为位于网格单元的正中心,如下图所示。

在网格单元的中心处定义纹素的 4x4 纹理的图示

如果你要求纹理采样器在 UV 坐标 (0.375, 0.375) 处获得这种纹理的颜色,那么将得到纯红色 (255, 0, 0)。 这是有道理的,因为红色纹素单元格的中心位于 UV (0.375, 0.375)。 如果你要求采样器在 UV (0.25, 0.25) 处获得这种纹理的颜色,会怎么样? 这并不容易,因为在 UV (0.25, 0.25) 处的点正好位于 4 个纹素的角处。

最简单的方案就是让采样器返回最近的纹素的颜色;这称为点筛选(请参见最近点采样),而由于粒状或块状结果,通常不期望进行点筛选。 在 UV (0.25, 0.25) 处对纹理进行点采样显示出最近点筛选的另一个微妙问题:存在与采样点等距离的四个纹素,因此不存在单个最近的纹素。 这四个纹素之一将被选择作为返回的颜色,但是选择取决于坐标是如何舍入的,这可能引入撕裂伪影(参见 SDK 中的“最近点采样”文章)。

稍微更精确和更常见的筛选方案是计算最接近采样点的 4 个纹素的加权平均值;这称为双线性筛选。 双线性筛选的额外计算成本通常可以忽略不计,因为此例程是在现代图形硬件中实现的。 以下是我们使用双线性筛选在几个不同的采样点处获得的颜色:

UV: (0.5, 0.5)

此点正好位于红色、绿色、蓝色和白色纹素之间的边界处。 采样器返回的颜色是灰色:

  0.25 * (255, 0, 0)
  0.25 * (0, 255, 0) 
  0.25 * (0, 0, 255) 
## + 0.25 * (255, 255, 255) 
------------------------
= (128, 128, 128)
UV: (0.5, 0.375)

此点位于红色纹素和绿色纹素之间的边界的中点。 采样器返回的颜色是黄灰色(注意,蓝色纹素和白色纹素的贡献被缩放为 0):

  0.5 * (255, 0, 0)
  0.5 * (0, 255, 0) 
  0.0 * (0, 0, 255) 
## + 0.0 * (255, 255, 255) 
------------------------
= (128, 128, 0)
UV: (0.375, 0.375)

这是红色纹素的地址,它是返回的颜色(筛选计算中的所有其他纹素的权重都被设置为 0):

  1.0 * (255, 0, 0)
  0.0 * (0, 255, 0) 
  0.0 * (0, 0, 255) 
## + 0.0 * (255, 255, 255) 
------------------------
= (255, 0, 0)

将这些计算与下图进行比较,可以看到如果在跨越 4×4 纹素的每个纹理地址处执行双线性筛选计算,会发生什么。

在每个纹理地址处执行双线性筛选的 4x4 纹理的图示

纹理筛选