与双线性过滤一样,采样颜色是根据 4 个最接近的纹素的加权平均值计算的,那么为什么角纹素在放大时会得到相同的颜色呢?
例如:
在这种情况下(下图),当 3x3 图像放大/缩放为 5x5 像素图像(使用双线性过滤)时,角“红色”像素也会获得完全相同的颜色,而边框“绿色”也会获得完全相同的颜色吗?
![]()
在一些文档中,解释了角纹素以相同的颜色扩展以提供 4 个相邻的纹素,这解释了为什么角“红色”纹素在 5x5 图像中获得相同的颜色,但边界“绿色”纹素为何获得相同的颜色(如果它们是根据 4 个最接近的纹素的加权平均值计算的)
当您使用双线性纹理采样时,纹理中的纹素不会被视为彩色方块,而是被视为连续色场的样本。这是红绿棋盘的字段,其中概述了纹理边框:
圆圈代表纹理像素,即纹理的样本位置。样本之间的颜色通过双线性插值计算。作为一种特殊情况,两个相邻纹理像素之间的插值是简单的线性插值。当x位于0和之间时1,则:color = (1 - x) * leftColor + x * rightColor。
插值方案仅定义在样本之间的区域中发生的情况,即甚至不到达纹理的边缘。OpenGL 使用纹理或采样器的环绕模式来确定缺失区域。如果您使用GL_CLAMP_TO_EDGE,则边缘的纹素值将像上面的示例一样重复。这样,我们就定义了任意纹理坐标的色域。
现在,当我们渲染 5x5 图像时,片段的颜色将在像素中心进行评估。如下图所示,其中片段评估位置用黑点标记:
假设您绘制一个纹理坐标范围为 0 到 1 的全屏四边形,则片段评估位置处的纹理坐标是顶点纹理坐标的插值。现在我们可以用片段覆盖之前的色域,我们将找到双线性采样器产生的颜色:
我们可以看到一些事情:
color = (1 - t) * outsideColor + t * insideColor,其中t = 3 * (0.5 / 5 + 0.5 / 3) = 0.8是插值参数。