应用程序不需要使用纹理筛选。 可以设置 Direct3D,以便计算纹素地址,该地址通常不为整数,并复制最接近整数地址的纹素的颜色。 此过程称为 最近点采样。 最近点采样可以在纹理的大小与屏幕上基元图像的大小相似时使用。 否则,必须放大或缩小纹理。 纹理大小与基元图像大小不匹配的结果可能导致图像出现粗糙感、锯齿或模糊效果。
仔细使用最近点采样,因为有时候在两个纹素之间的边界采样纹理时,可能会导致图形伪影。 此边界处于纹理坐标(u 或 v)的某个位置,在此处采样的纹素从一个纹素过渡到下一个纹素。 使用点采样时,系统在两个样本纹素中选择其一,并且结果可能会在纹素边界交错时突然从一个纹素变为下一个纹素。 此效果可以在显示的纹理中显示为不需要的图形项目。 使用线性筛选时,生成的纹素从相邻纹素计算,并在纹理索引穿过边界时平滑混合。
当将一个非常小的纹理映射到非常大的多边形时,可以看到这种效果:通常称为放大的操作。 例如,使用看起来像棋盘的纹理时,最近的点采样会导致显示不同边缘的较大棋盘。 相比之下,线性纹理筛选会导致图像中棋盘颜色在多边形之间平滑变化。
在大多数情况下,应用程序需要尽量避免使用最近点采样以获得最佳结果。 目前大多数硬件都针对线性筛选进行了优化,因此应用程序不应降低性能。 如果需要的效果确实要求使用最近点采样,例如在使用纹理显示易读的文本字符时,应用程序必须非常小心,避免在纹素边界进行采样,以免导致不期望的效果。 下图插图显示了这些工件可能的外观。
该组右上角的两个正方形看起来与其他正方形不同,斜线纹穿过它们。 若要避免此类图形项目,必须熟悉 Direct3D 纹理采样规则,以便进行最近的点筛选。 Direct3D 将浮点纹理坐标从 [0.0, 1.0] (0.0 到 1.0(含)映射到介于 [- 0.5、 n - 0.5] 的整数纹素空间值之间,其中 n 是纹理上给定维度中的纹素数。 生成的纹理索引舍入为最接近的整数。 此映射可能在纹素边界引入采样误差。
对于一个简单的示例,假设一个使用 Wrap 纹理寻址模式呈现多边形的应用程序。 使用 Direct3D 的映射,对于宽度为 4 纹素的纹理,u 纹理索引的映射如图所示。
在纹素 之间的边界处具有纹理坐标 0.0 和 1.0 的图示为
此图的纹理坐标(0.0 和 1.0)正好位于纹素之间的边界。 使用 Direct3D 映射值的方法,纹理坐标范围为 [ - 0.5, 4 - 0.5],其中 4 是纹理的宽度。 在这种情况下,采样的纹素是纹理索引为 1.0 的 0 纹素。 但是,如果纹理坐标略小于 1.0,则采样的纹素将是 n 纹素而不是 0 纹素。
这意味着,使用纹理坐标精确为 0.0 和 1.0 的纹理坐标放大小纹理,并在屏幕空间对齐的三角形上进行最近的点筛选,从而产生纹理贴图在纹素之间的边界上采样的像素。 纹理坐标计算中的任何不准确(无论多么细微)都会导致在渲染图像中,与纹理贴图的纹素边缘相对应的区域出现视觉伪影。
以完美精度执行浮点纹理坐标到整数纹素的映射是困难的,计算上耗时且通常没有必要。 大多数硬件实现都使用迭代方法计算三角形内每个像素位置的纹理坐标。 迭代方法往往隐藏这些不准确之处,因为错误在迭代期间会均匀累积。
Direct3D 参考光栅器使用直接评估方法来计算每个像素位置的纹理索引。 直接评估不同于迭代方法,即操作中的任何不准确都表现出更随机的错误分布。 结果是,边界处发生的采样错误可能更明显,因为引用光栅器不会以完美的准确度执行此操作。
最佳方法是仅在必要时使用最近的点筛选。 必须使用该功能时,建议将纹理坐标稍微偏移出边界位置,以避免失真。
相关主题