Как выполнить быстрый наклон текстуры Catmull-Rom с помощью линейной интерполяции?
Я прочитал несколько статей, в которых представлена быстрая интерполяция третьего порядка с использованием GL_LINEAR.
- [1] http://http.developer.nvidia.com/GPUGems2/gpugems2_chapter20.html
- [2] http://0xef.wordpress.com/2013/01/12/third-order-texture-filtering-using-linear-interpolation/
Поскольку [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, которая содержит отрицательные части, условие (0 <= b/(a +b) <= 1) не может быть выполнено полностью. На самом деле, я пытался реализовать Catmull-Rom с той же логикой, он выдает только размытые изображения.
Есть ли особый способ применить метод из [1] и [2] к интерполяции Катмулла-Рома? Или я должен получить все 16 текселей для Catmull-Rom?
1 ответ
Я думаю, что статья Сигга и Хадвигера верна.
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;
а также p0
, p1
, p2
, p3
являются выборочными значениями функций.
Для B-сплайна вы группируете первые два слагаемых, а именно w0(t) * p0
а также w1(t) * p1
и вторые два термина, а именно w2(t) * p2
а также w3(t) * p3
, Для сплайна Catmull-Rom вы группируете w0(t) * p0
а также w3(t) * p3
а также w1(t) * p1
а также w2(t) * p2
, Даже с помощью графика Матлаба легко проверить, что условие b/(a+b)
доволен этим выбором. Таким образом, идея может быть использована и в интерполяции Катмулла-Рома. Однако для случая Кэтмулла-Рома мне кажется, что нет возможности продлить последний шаг, поскольку ни (w0(t) + w3(t))/(w0(t) + w1(t) + w2(t) + w3(t))
ни (w1(t) + w2(t))/(w0(t) + w1(t) + w2(t) + w3(t))
соответствовать указанному вами условию.