与双线性过滤一样,采样颜色是基于4个最接近纹理像素的加权平均值计算的,那么为什么角纹理像素在放大时会得到相同的颜色?
例如:
在这种情况下(下图),当将3x3图像放大/缩放为5x5像素图像(使用双线性过滤)时,“红色”像素的角也获得完全相同的颜色,而“绿色”边框也完全相同?
在某些文档中,说明了角纹理像素以相同的颜色扩展以提供4个相邻的纹理像素,这解释了为什么“红色”纹理像素在5x5图像中获得相同的颜色,但是边框“绿色”纹理像素如何得到相同的颜色(如果是根据4个最接近的纹理像素的加权平均值计算的话)
答案 0 :(得分: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
是插值参数。答案 1 :(得分:2)
您正在错误地查看双线性插值。将其视为从目标像素位置到源像素位置的映射。因此,对于每个目标像素,都有一个与之相对应的源坐标。源坐标决定了4个相邻像素以及分配给它们的双线性权重。
让我们用左上角的(0,0)为像素编号。
目标图像中的像素(0,0)映射到源图像中的坐标(0,0)。源图像中的四个相邻像素为(0,0),(1、0),(0,1)和(1,1)。我们通过简单的数学计算双线性权重:特定像素在X方向上的权重为1 - (pixel.x - source.x)
,其中source
是源坐标。 Y也是如此。因此,四个相邻像素中的每个像素的双线性权重分别为(分别为上述顺序):( 1,1),(0,0),(0,0)和(0,0)。
简而言之,因为目标像素精确地映射到了源像素,所以它精确地获得了源像素的值。这是应该的。