1. 程式人生 > >Shader專題:卡通著色(一)控制顏色的藝術

Shader專題:卡通著色(一)控制顏色的藝術

## 什麼是 Shader? 關於什麼是 Shader ,各種百科各種教程都有說過,但是今天我們就從一個另一個角度去試著理解什麼是 Shader? 我們先看下 Shade 的英文意思,如下: v.給...遮擋(光線);把...塗暗 其中 把...塗暗 更貼近我們想要的意思。 所以:Shader 這個單詞從字面上理解,就是把什麼東西塗暗。 再強調一次:Shader 從單詞字面上理解,就是把什麼東西塗暗。 再強調一次:把什麼東西塗暗的就是 Shader,就是著色器。 ## Shader 把什麼塗暗了? 當然是遊戲世界的各個物體,總所周知:有光明就有黑暗,有光照物體就有明暗對比,同時也會有陰影,而 Shader 之所以叫 Shader 是因為起初的時候,Shader 就是用來給物體增加明暗對比的,有了明暗對比,物體在遊戲世界中就會更加立體,從而畫面會更加真實。 所以 Shader 的作用就是給物體新增明暗對比。 ## Shader 為什麼叫 Shader 當然以上純屬個人推測。現在 Shader 不止可以給物體新增明暗對比,而且還可以做很多濾鏡效果,也可以做很多效能優化(比如減少包大小、減少圖片記憶體等)的事情。 也許,一開始給 Shader 起名叫 Shader 的時候,Shader 功能非常有限,僅僅只是給物體新增明暗對比(也就是光照計算),後來由於硬體和軟體的發展, 很多離線渲染(電影 CG)的演算法都逐步應用在實時渲染(主要是 遊戲 和3D 模擬等),Shader 能做的事情就越來越多,發展到今天,Shader 主要的功能並不只有光照計算。這樣導致,在概念理解上給很多初學者增加了很多阻礙。 教練有一次聽過一位搞圖形學的朋友說:“我們搞實時渲染的都是那些搞視訊(離線渲染)玩剩的”。 ## Shader 是著色器 什麼是 Shader,中文叫做著色器,也就是給物體上色的意思,也就是說寫 Shader 就是給物體上色的藝術。而這個上色不只是簡單的色彩填充,而是涵蓋了非常多的技巧(幾何計算、顏色計算、貼圖等) 所以中文的著色器,是一個非常精準的翻譯。 群內的笑笑說了一個比較不錯的說法:Shader 主要是光線資料作用在不同資料的物體上產生不同效果。 ## Shader 學習的順序 不管是 Shader 還是其它某個科目,都有一些最常用、最簡單的知識點。 而這些知識點很容易學以致用,也就是說,這種知識點,我們學習完了就能馬上落地。 所以,教練要做的就是,把 Shader 中的知識點按照是否常用和是否簡單這兩個維度進行排列篩選,然後把它們一個個整理成案例,這樣童鞋們的學習體驗就會大幅上升。 ## 主題式研究第三個階段 - 第一個階段:確定主題(關鍵字) - 第二個階段:搜尋資料、搜尋資訊(蒐集情報) - 第三個階段:構建知識體系(畫腦圖、寫大綱) 到此,Shader 這個主題,我們目前已經到了第三個階段,也就是構建知識體系的階段。 當然,這一整篇,都再講,我們要怎麼怎麼做,接下來幹嗎,並沒有學習 Shader 的任何一個知識點。 那麼今天就學習一點 Shader 知識意思一下。 ## 顏色的控制 現有一張貼圖,如下: ![螢幕快照 2019-07-03 上午11.09.08.png](https://i.loli.net/2019/07/03/5d1c4283dd75732329.png) 用來控制顏色的 shader 程式碼如下: ```js float4 frag (v2f i) : SV_Target { // 圖片上每個畫素的顏色值 float4 color = tex2D(_MainTex, i.uv); // 返回顏色,表示將改畫素的顏色值輸出到螢幕上 return color; } ``` 我們只看方法中的程式碼,先不要在意一些細節。 雖然,我們沒有 Shader 的語法學習經驗,但是憑我們的 C# 經驗,可以將上述程式碼推測個大概來。 首先 float4 是一個型別,可以儲存 4 個 float 數值。而顏色一般都是由 r(red 紅色)、g(green,綠色)、b(blue,藍色)、a(alpha,透明度) 四個值控制。所以 float4 可以儲存一個顏色。 現在,我們把圖片中每個畫素顏色重的紅色值設定為 0,圖片結果則如下所示: ![螢幕快照 2019-07-03 上午11.17.01.png](https://i.loli.net/2019/07/03/5d1c429881a1050254.png) 程式碼如下所示: ```js float4 frag (v2f i) : SV_Target { // 圖片上每個畫素的顏色值 float4 color = tex2D(_MainTex, i.uv); color.r = 0; // 返回顏色,表示將改畫素的顏色值輸出到螢幕上 return color; } ``` 我們看到,圖片變成了藍綠色。 ## 小結 Shader 是一門控制顏色的藝術,Shader 的核心也是如此。 在此篇,我們學習了 Shader 的兩個重要知識點: 1. float4 結構體 2. 顏色的 rgb 控制 這兩個知識點非常簡單,也非常基礎,但是是非常常用的兩個知識點。 這片文章的內容就這些。 ## 知識地圖 ![螢幕快照 2019-07-03 上午11.23.50.png](https://i.loli.net/2019/07/03/5d1c42acc6c8856652.png) ## 相關下載: ![image.png](http://file.liangxiegame.com/38048b87-5459-462a-827d-42cea2b02e62.png) 轉載請註明地址:liangxiegame.com 更多內容 QFramework 地址:https://github.com/liangxiegame/QFramework QQ 交流群:623597263 涼鞋的主頁:https://liangxiegame.com/zhuanlan 關注公眾號:liangxiegame 獲取第一時間更新通知及更多的免費內容。