Я хочу дать эффект изображениям, где результирующее изображение появилось бы, как будто мы смотрим на него через текстурированное стекло (не простой/гладкий)... Помогите мне в записи алгоритма генерировать такой эффект.
Вот пример типа эффекта, который я ищу
Первое изображение является исходным изображением, и второе изображение является выводом, который я ищу.
Начните с создания карты шума с размерами (ширина + 1) X (высота + 1)
, которые будут использоваться, вытесняя исходное изображение. Я предлагаю использовать некоторое из них шум для перлина , чтобы перемещение не случайно. Вот хорошая ссылка о том, как генерировать шум Perlin.
Как только у нас шум, мы можем сделать что-то вроде этого:
Image noisemap; //size is (width + 1) x (height + 1) gray scale values in [0 255] range
Image source; //source image
Image destination; //destination image
float displacementRadius = 10.0f; //Displacemnet amount in pixels
for (int y = 0; y < source.height(); ++y) {
for (int x = 0; x < source.width(); ++x) {
const float n0 = float(noise.getValue(x, y)) / 255.0f;
const float n1 = float(noise.getValue(x + 1, y)) / 255.0f;
const float n2 = float(noise.getValue(x, y + 1)) / 255.0f;
const int dx = int(floorf((n1 - n0) * displacementRadius + 0.5f));
const int dy = int(floorf((n2 - n0) * displacementRadius + 0.5f));
const int sx = std::min(std::max(x + dx, 0), source.width() - 1); //Clamp
const int sy = std::min(std::max(y + dy, 0), source.height() - 1); //Clamp
const Pixel& value = source.getValue(sx, sy);
destination.setValue(x, y, value);
}
}
я не могу предложить вам определенный пример, но gamedev , форумы и разделы статей имеют много золота для обработки изображений, 3-го рендеринга, и т.п. Например, вот статья , говорящая об использовании матриц свертки для применения подобных эффектов к изображениям, которые могли бы быть хорошей начальной точкой.