用DDA Convolution和Perlin Noise来模拟水粉画笔触
在西方,水彩画和水粉画是可以统称为Watercolor的,水粉画通常也称为不透明水彩画或树胶水彩画(Gouache),两者既有相似之处,又有所区别。水粉画是以水作为媒介,这一点,它与水彩画是相同的。所以,水粉画也可以画出水彩画一样的酣畅淋漓的效果。但是,它没有水彩画透明。此外,水粉画和油画也有相同点,就是它也有一定的覆盖能力。而与油画不同的是,油画是以油来作媒介,颜色的干湿几乎没有变化。而水粉画则不然,由于水粉画是以水加粉的形式来出现的,干湿变化很大。所以,它的表现力介于油画和水彩画之间。
这里我使用对Perlin Noise进行DDA Convolution的方式来模拟水粉画的笔触效果。大致流程如下:
1.生成Perlin Noise
Perlin Noise是由Ken Perlin发明的一种噪声函数,它能够很好地模拟火焰、云彩、奇形怪状的岩石,以及树木和大理石表面。这里是Perlin在GDC 99上做的关于Perlin Noise的PPT(http://www.noisemachine.com/talk1/)。要想很快的入门可以看这里(http://freespace.virgin.net/hugo.elias/models/m_perlin.htm),AZURE兄将其翻译成了中文(http://www.azure.com.cn/article.asp?id=291)。
Perlin Noise计算量很大,如果纯粹的用CPU计算会很慢,达不到实时的效果。这里用GPU来计算,速度比CPU快得多。可以通过设置Noise函数的Frequency和Amplitude来调节Perlin Noise的Gain(对比度)和Bias(明亮度)。下图是生成的一种Perlin Noise效果:
2.将Perlin Noise与原始图像Blend
这是原始图像:
融合后:
3.对Blend后的图像进行DDA Convolution
DDA Convolution是LIC(线性积分卷积)的简化版本。LIC常用于科学计算可视化的向量场模拟中,能够很好的表现向量的方向(比如流体的流动方向)。DDA是数字微分分析式(Digital Differential Analyzer)的缩写,DDA直线生成算法是计算机图形学中的最经典的算法之一(关于该算法的详细内容请参见计算机图形学教材)。这里用DDA将水粉画笔触的方向离散成像素点,然后对这些点进行线性卷积,就能产生不错的笔触效果。可以调节DDA Convolution的强弱,来产生不同程度的笔触效果。
Perlin Noise能产生比较平滑的团絮效果(比如云彩),对它进行DDA Convolution后能产生比较逼真的水粉画笔触效果。调节Perlin Noise的Gain(对比度)和Bias(明亮度),可以控制笔触的粗糙程度(是stroke还是brush)。下面是最后生成的效果(这里笔触方向是水平向右方向,由于各种参数没有调好,所以可能效果不是很好,^^)
虽然Perlin Noise和DDA Convolution不能真实模拟水粉画画笔的物理模型,但它确实能模拟水粉画笔触的效果。图形学本来就是科学和艺术的结合体,NPR尤是。不管你用什么方法,只要能模拟出效果来就是好方法,这也正是图形学吸引我的原因之一。
Author: Skyman (吴俊)
版权所有,未经允许,不得转载
---------------------------------------------------