如何通过线性插值执行快速Catmull-Rom纹理倾斜?

时间:2013-11-03 11:39:11

标签: opengl glsl interpolation catmull-rom-curve

我读过一些使用GL_LINEAR引入快速三阶插值的文章。

因为[1]包含大量的勘误表,如果你想要了解形式主义,我建议阅读[2]。

他们都提到了这种方法的限制。对于使用GL_LINEAR的过滤纹理,仅当0< = b /(a + b)< = 1

时,下一个关系才会保持
  

a * f(i,j)+ b * f(i + 1,j)= F(i + b /(a + b),j)

其中f是原始图像数据,F是OpenGL的线性插值纹理。

这是问题所在。 [1]提到这种方法也可以应用于Catmull-Rom双三次方。

  

该方法还可以适用于内插滤波器,如Catmull-Rom样条

然而,显而易见的是,对于包含负部分的Catmull-Rom加权函数,条件(0 <= b /(a + b)<= 1)不能被完全填充。事实上,我试图用相同的逻辑实现Catmull-Rom,它只产生模糊的图像。

是否有一种特殊的方法将[1]和[2]中的方法应用于Catmull-Rom插值? 或者我是否必须为Catmull-Rom获取所有16个纹素?

1 个答案:

答案 0 :(得分:1)

我认为Sigg和Hadwiger的论文是正确的。

Catmull-Rom多项式p(t)可写为

p(t) = 0.5 [ w0(t) * p0 + w1(t) * p1 + w2(t) * p2 + w3(t) * p3]

,其中

w0(t) = -t + 2*t^2 - t^3;
w1(t) = 2 - 5*t^2 + 3*t^3;
w2(t) = t + 4*t^2 - 3*t^3;
w3(t) = -t^2 + t^3;

p0p1p2p3是采样函数值。

对于B样条,您将前两个术语(w0(t) * p0w1(t) * p1以及后两个术语(w2(t) * p2w3(t) * p3组合在一起。对于Catmull-Rom样条曲线,您可以将w0(t) * p0w3(t) * p3以及w1(t) * p1w2(t) * p2组合在一起。即使通过Matlab绘图,也很容易验证条件b/(a+b)是否满足此选择。因此,这个想法也可以用于Catmull-Rom插值。但是,对于Catmull-Rom案例,在我看来,最后一步没有可能的扩展,因为(w0(t) + w3(t))/(w0(t) + w1(t) + w2(t) + w3(t))(w1(t) + w2(t))/(w0(t) + w1(t) + w2(t) + w3(t))都不符合您指定的条件。