Latex formulas

суббота, 11 февраля 2012 г.

Фильтруй базар!


Добился почти идеального качества картинки, правда за счет резкого падения производительности (правда на моём компьютере програмка бегает очень даже шустро, если включить оптимизацию в clang).

В этой программе я буду использовать карту высот 512x512 и такую же "текстурку" (на самом деле простой массив, генерируемый на ходу, но SDL также отлично работает и с файлами.)

Вспомним, теперь, что координаты в пространстве мы представляли числами типа int (что и понятно, ведь из координат строится индекс массива - целое число!).

Теперь представим, что наши карта высот и текстуры - некие функции от координат x,y, где x и y - вещественные числа. Тогда логичнее задать наши координаты числами типа float или double (хотя тут кроется потеря производительности, например, мы уже не сможем продолжить нашу карту на всю плоскость простыми бинарными операциями и будем использовать деление и умножение).

Как найти эту функцию? Тут мы будем пользоваться техникой билинейной фильтрации, основанной на билинейной интерполяции.

Допустим, мы знаем, что в координатах x = x0, y = y0 f(x,y) = z0, где x0, y0 целые числа.
Аналогично:
f(x1,y0) = z1
f(x0,y1) = z2
f(x1,y1) = z3 (все координаты - целые)

Определим z = f(x,y) так:





Как определить высоту ландшафта в точках (2.32, 3.54)? Возьмем x0=2, y0=3, x1=3, y1=4 как можно ближе к нашим координатам и воспользуемся данными формулами.

В этом и заключается принцип билинейной фильтрации - взять 4 соседних пиксела, где значение высоты известно и интерполировать по ним.

Формулы можно упростить. Как? Смотри википедию. Я лишь приведу готовый результат + картинки.

Картинка до (картинка после - в начале статьи):


Недостаток таков: при передвижении по миру высота пика будет меняться + картинка выглядит блочной. Это связано с тем, что семплы на карте высот берутся не все, а через некоторый шаг.
Избавиться от этого просто: уменьшить шаг хода луча. Тогда получим идеальную картинку, лишенную всякой блочности (но потеряем в производительности):



Код программы:

Открыть спойлер

Комментариев нет:

Отправить комментарий