不想看廢話的話可以直接CTRL + F 搜尋「分隔線」
做遊戲的時候,有時候美術風格想要使用像素風,然後美術大大們就開始畫圖
畫好之後他們總是想要看看丟進遊戲裡是甚麼形狀,因為有些不負責任的程序猿在做Prototype的時候只會東拼西湊的盜圖,誰管你什麼美術風格。或是偶爾秀秀他們的火柴人下限,讓美術們在素材生出來之前根本不想看遊戲畫面。
這時程序猿把圖片丟進了Scene
然後可能會產生以下對話:
程序猿:我覺得很棒
美術:所以我的圖為啥整組糊掉了...?
美術:好像有種東西叫做Pixel Perfect Camera,用用看嗎?
(然後程序猿跑去抓了這個package,但是似乎沒甚麼效果)
程序猿:好像差不多,我也不知道為甚麼,先這樣。
以上前導劇情終於演完了,接下來可以來看看要怎麼讓這些像素風素材正確呈現
----------------------------------------------------------分隔線----------------------------------------------------------
懶人包:
問題的根源在於Unity怎麼對素材圖進行採樣,預設使用Bilinear (線性過濾),需要改為Point 才有辦法展現出像素風素材的真正樣貌。
看個比較圖 (左Point, 右Bilinear)
你說你知道怎麼操作了,但不懂Bilinear和Point 背後的算法哪裡不一樣?
電腦算出來的圖都是由一個個像素所組成的,需要對目標圖進行一個叫做「採樣」的動作。
當想要渲染的大小和圖片本身解析度不符的時候,就不會把圖片的每一個像素都忠實呈現在螢幕上。 (想像成把一張小圖過度放大,電腦總是要試著去猜放大的部分應該要填入甚麼顏色)
採樣的方法主要有兩種,就是前面提到的Bilinear 和 Point,在OpenGL的紋理過濾中被稱做GL_LINEAR 和 GL_NEAREST
頂點著色器 (Vertex Shader) 以三角面勾勒出一張圖的範圍後,片段著色器 (Fragment Shader) 就需要知道這些範圍內要填入甚麼樣的顏色,這時候Bilinear 和 Point的設定分歧就會讓片段著色器決定不同的輸出了
「+」是片段著色器對圖片採樣的座標,returns 則是片段著色器會輸出的顏色
Belinear (GL_LINEAR) Point (GL_NEAREST)
可以發現Bilinear會把周圍的像素點都納入考慮,最後輸出一個帶有各個顏色權重的混色
而Point 則是直接回傳採樣點上面的像素點
看到這邊大家應該都了解到為什麼使用Belinear再把圖放大後會讓像素風的圖片糊掉了
至於Unity使用Belinear做為預設值的原因,我認為是因為Belinear可以呈現較平滑、真實的輸出,強調顆粒感的Point 是相對於特殊的美術風格,所以才不被選為預設值。