在西方,水彩畫和水粉畫是可以統稱為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尤是。不管你用什么方法,只要能模擬出效果來就是好方法,這也正是圖形學吸引我的原因之一。