direct3D 9) (双线性纹理筛选
纹理始终从左上角的 (0.0、0.0) 线性寻址到右下角 (1.0、1.0) ,如下图所示。
纹理通常看似由固态色块构成,但实际上应将纹理视为等同于光栅显像才更为准确:每个纹素均定义为位于网格单元的正中心,如下图所示。
如果你要求纹理采样器在 UV 坐标 (0.375, 0.375) 处获得这种纹理的颜色,那么将得到纯红色 (255, 0, 0)。 这是完全有意义的,因为红色纹素单元格的确切中心在 UV (0.375, 0.375) 。 如果你要求采样器在 UV (0.25, 0.25) 处获得这种纹理的颜色,会怎么样? 这并不容易,因为 UV (0.25、 0.25) 的点位于 4 纹素的确切角落。
最简单的方案只是让采样器返回最接近纹素的颜色;这称为点筛选 (请参阅 最近点采样 (Direct3D 9) ) ,并且通常是由于粒度或块状结果而不需要的。 在 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 纹素的每个纹理地址处执行双线性筛选计算,会发生什么。
相关主题