在 canvas 上模拟 OpenGL 纹理环绕 + 插值?

Simulate OpenGL texture wrap + interpolation on canvas?

我正在开发一个基于 java/canvas 的编辑器,用于创建带纹理的形状。结果稍后在 OpenGL 中呈现,但我需要模拟纹理中颜色像素的插值。

假设我有一个 10 纹素 x 1 纹素的纹理。我为 canvas 的一部分指定了 0.0 到 1.0 的范围。所以我插入每个 canvas 像素的纹理坐标,找到两个相邻的纹素并插入颜色。

现在我想从 tex 0.0 绘制到 2.0 并重复纹理。模计算已经不是微不足道的 anmyore,因为 1.0, 2.0, ... 需要映射到 1.0,而 1.x, 2.x, ... 需要映射到 0.x .

到目前为止,即使对于负值,我也能做到这一点。但是,当发生换行时,插值是 "cut of"。不考虑最后一个纹素 (1.0) 和重复的第一个纹素 (0.0) 之间的范围。

我该如何正确模拟?我想我必须处理一半 pixel/texel 偏移量。我希望 0.0;1.0 绘制一次纹理,0.0;2.0 绘制两次,-1.0;2.0 绘制三次(依此类推)并在重复纹理的地方使用正确的插值。这必须通过一些简单的移位和模数公式才能实现,对吗?

是否有一些 "cheap trick" 比如在外部添加两个纹理元素以进行连续插值,并使用一些偏移魔法来解决缩放问题?

你的错误是,纹理坐标 (0.0) 没有到达第一个纹素的中心。它确实击中了第一个纹素的左边缘。

因此,为了使用线性插值实现环绕,(0.0) 的纹理坐标将导致读取第一个纹素和最后一个纹素并用 0.5 对它们进行加权。 (1.0) 的纹理坐标将到达最后一个像素的右边缘,然后将产生与 tc (0.0) 完全相同的颜色。