入門效果之馬賽克
接下來(lái)我們完成一個(gè)更加常見(jiàn)的效果—馬賽克。圖片的馬賽克就是把圖片的一個(gè)相當(dāng)大小的區(qū)域用同一個(gè)點(diǎn)的顏色來(lái)表示。可以認(rèn)為是大規(guī)模的降低圖像的分辨率,而讓圖像的一些細(xì)節(jié)隱藏起來(lái)。
用HLSL代碼實(shí)現(xiàn)馬賽克是非常簡(jiǎn)單的。但是同樣的需要一些額外的步驟。
第一步就是先把紋理坐標(biāo)轉(zhuǎn)換成圖像實(shí)際大小的整數(shù)坐標(biāo)。接下來(lái)要把圖像這個(gè)坐標(biāo)量化---比如馬賽克塊的大小是8x8象素。那么我們可以用下列方法來(lái)得到馬賽克后的圖像采樣值,假設(shè)[x.y]為圖像的整數(shù)坐標(biāo):
[x,y]mosaic = [ int(x/8)*8 , int(y/8)*8].
得到這個(gè)坐標(biāo)后只要用相反的方法,把整數(shù)坐標(biāo)轉(zhuǎn)換回到0-1.0的紋理坐標(biāo)。
具體的馬賽克效果代碼如下:

經(jīng)過(guò)這個(gè)Shader處理后的圖像結(jié)果如下:

圖:馬賽克處理效果
讀者可能會(huì)發(fā)現(xiàn)這個(gè)馬賽克太普通了,確實(shí)它不夠新穎。下面我們來(lái)改良一下,我們希望達(dá)到這樣一個(gè)效果:馬賽克區(qū)域不是方的,而是圓的,圓形區(qū)域以外,依舊用圖像原來(lái)的顏色覆蓋。這樣需要改變一下代碼。
首先求出原來(lái)馬賽克區(qū)域的正中心(原來(lái)是左上角):然后計(jì)算圖像采樣點(diǎn)到這個(gè)中心的距離,如果在馬賽克圓內(nèi),就用區(qū)域的中心顏色,否則就用原來(lái)的顏色。改良后的代碼如下,這里把馬賽克區(qū)域大小調(diào)節(jié)成16x16。這樣效果更明顯。

這個(gè)代碼相對(duì)上面的代碼復(fù)雜了一些,加了一個(gè)分支if/else。注意,GPU是個(gè)高度并行的處理器,過(guò)多分支會(huì)降低Shader的運(yùn)行速度。這個(gè)改良的馬賽克效果如下

圖: 改良后的馬賽克效果