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

經過這個Shader處理后的圖像結果如下:

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

這個代碼相對上面的代碼復雜了一些,加了一個分支if/else。注意,GPU是個高度并行的處理器,過多分支會降低Shader的運行速度。這個改良的馬賽克效果如下

圖: 改良后的馬賽克效果
posted on 2007-11-13 01:45
七星重劍 閱讀(1123)
評論(0) 編輯 收藏 引用 所屬分類:
Game Graphics 、
HLSL&ShaderMonkey