XNA CPU插值?

4

CPU上的插值

我希望能够在CPU上进行插值。

考虑以下示例:

X1 | X2

-------

X3 | X4

X1,X2,X3和X4都是像素(以Vector4格式)。它们都具有以下坐标。

  • X1:{X: 0,Y: 0}
  • X2:{X: 1,Y: 0}
  • X3:{X: 0,Y: 1}
  • X4:{X: 1,Y: 1}

现在,我想根据给定的Vector2在像素之间进行插值。

所以假设我想要坐标为{X:0.348,Y:0.129}的颜色。

我应该如何正确地在像素之间进行插值?

我为什么要这样做

我知道这听起来很疯狂,但这就是我想做的事情。我正在尝试在CPU上模拟GPU着色器算法。这是用于Perlin噪声生成器的。我已经通过像素着色器在游戏中生成了2D地形,并且我想能够(在给定的X,Y和Z坐标处)检查是否存在墙壁,使用完全相同的算法在CPU上。

如果您想了解更多关于我正在尝试做什么的信息,请参见此问题:https://gamedev.stackexchange.com/questions/15667/perlin-noise-copying-the-algorithm-on-the-cpu

编辑

我将此帖子发布到了错误的位置。它应该在"gamedev.stackexchange.com"中。无论如何,我希望你有答案。


这并不是一个荒谬的问题...虽然提供关于您试图实现什么的信息可能会为回答问题提供有用的额外信息。 - Andrew Russell
我已经编辑了帖子以反映这一点。谢谢。 - Mathias Lykkegaard Lorenzen
1
在CPU上进行插值并不是很疯狂。但是,如果你想要得到与GPU完全相同的结果,那就有点疯狂了。你需要考虑的一件事是这个链接:http://msdn.microsoft.com/en-us/library/bb219690(v=vs.85).aspx。 - Andrew Russell
1个回答

6
你需要的是双线性插值Wikipedia)。
XNA的Lerp函数执行线性插值 - 即:在一个轴上。而双线性插值则是在两个轴上进行。幸运的是,这只是在一个轴上进行线性插值(两次:每个轴上的每一对输入各一次),然后线性插值两个结果。
因此,你可以像这样做:
Vector2 position = new Vector2(0.348f, 0.129f); // <- example data from question

Vector4 result = Vector4.Lerp(Vector4.Lerp(X1, X2, position.X),
                              Vector4.Lerp(X3, X4, position.X),
                              position.Y);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接