为什么插值给出的结果与梯度不同?

Why interpolation gives different results than a gradient?

我有一个像素高度的不同灰度纹理,带有 GL_LINEAR 插值。 纹理 T(k) 由从左到右的 k 个像素的渐变组成,从 0(黑色)到 255(白色)。

示例:

T(2) = 0 255
T(3) = 0 128 255
T(4) = 0 85 170 255
T(256) = 0 1 2 ... 255

那里有一些呈现的例子:

T(002)=

T(003)=

T(004)=

T(255)=

为什么纹理有不同的结果?当使用更多像素时,渐变看起来更漂亮。

实际上,如果我想要相同的结果,我不能使用更少的像素来渲染漂亮的渐变来节省内存。我想“正确”的渐变是像素最多的渐变,T(256).

Why textures do have different results ? The gradient appears more nicely arranged when more pixels are used.

因为你对纹理坐标的假设是错误的,s=0.0是左纹素的左1.0是纹素的右边缘最右边的一个。

对于宽度为 2 的纹理,纹素中心位于 0.250.75,如果您在该范围之外采样,您的环绕模式(在您的情况下似乎是 GL_CLAMP_TO_EDGE) 将适用。

如果你想看到线性渐变,你必须从 1/(2*width)1-1/(2*width)。如果你增加width,这些值当然会向01靠拢,所以当width接近无穷大时,它会收敛到你想要的结果。