玻璃效应 - 艺术效果

时间:2010-01-11 06:47:10

标签: c++ c algorithm graphics

我希望对图像产生影响,结果图像看起来好像我们通过纹理玻璃(不是普通/光滑)看着它...请帮我写一个算法来产生这样的效果

这是我正在寻找的效果类型的an example

第一张图片是原始图片,第二张图片是我正在寻找的输出。

2 个答案:

答案 0 :(得分:4)

首先创建一个尺寸为(width + 1) x (height + 1)的噪点贴图,用于替换原始图像。我建议使用某种perlin noise,以便移位不是随机的。关于如何生成perlin噪声,这是一个很好的link

一旦我们有噪音,我们可以做这样的事情:

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);
    }
}

答案 1 :(得分:1)

我无法向您提供具体示例,但gamedev论坛&amp;文章部分有很多金币用于图像处理,3d渲染等。 例如,这里有an article讨论使用卷积矩阵对图像应用类似的效果,这可能是一个很好的起点。