XNA интерполяция на процессоре? - PullRequest
4 голосов
/ 07 августа 2011

Интерполяция на 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}

Теперь я хочу сделать интерполяцию между пикселямис заданным вектором 2.

Допустим, мне нужен цвет координат {X: 0.348, Y: 0.129}.

Как правильно интерполировать пиксели?

Почему я хочу это сделать

Я знаю, это звучит безумно, но это то, что я хочу сделать.Я пытаюсь смоделировать алгоритм GPU шейдера на процессоре.Это для генератора шума Perlin.Я уже получил 2D ландшафт, сгенерированный с помощью пиксельного шейдера таким образом в игре, и я хочу иметь возможность (с заданными координатами X, Y и Z) проверить, есть ли там стена или нет, используя точнуютот же алгоритм на процессоре.

Если вы хотите узнать больше о том, что я пытаюсь сделать, посмотрите этот вопрос: https://gamedev.stackexchange.com/questions/15667/perlin-noise-copying-the-algorithm-on-the-cpu

Редактировать

Я написал это не в том месте.Это должно было быть в "gamedev.stackexchange.com".Я надеюсь, у вас все равно есть ответ.

1 Ответ

6 голосов
/ 07 августа 2011

То, что вы ищете, это билинейная интерполяция ( 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);
...