哈囉,感覺我很少在巴哈上更新XD
在之前發布了
《T.O.W.E.R.S》正式版後就先暫時沒有再繼續增加內容,不過最近有開始去研究了之前一直沒有碰過的Shader,今天就讓我們先簡單看一下這玩意兒到底是什麼吧。
什麼是Shader?
Shader中文又稱著色器,簡單來說的話是用來處理渲染的程式 ,但是不同於我們平常所寫的其他程式(C#,Java之類的)是交給CPU完成運算,Shader是交給GPU來處理。
(
圖源與其說明,簡單來說的話CPU是單一一個很強的運算單元,而GPU則是多個較弱的運算單元,前者擅長單一且複雜的工作,後者則擅長大量但簡單的工作,例如繪圖)
Shader則又可細分成
-Vertex Shader 頂點著色器
-Pixel Shader (fragment shader) 片元著色器 (我習慣稱像素/平面著色器)
-Geometry shader 幾何著色器
-Compute shader 計算著色器
-Tessellation/hull 細分曲面著色器
是不是覺得太多了?我也這麼覺得,不過其實可以不用急著把全部的Shader種類都先搞懂 (應該啦)
對於剛碰的人來說,我想先把前兩個Shader搞懂就好了
-Vertex Shader
-Pixel Shader (fragment shader)
基本渲染過程
一般來說如果我們要讓電腦繪製一個方塊的話,我們會先有這個方塊的網格資訊(它的外觀形狀,由數個頂點構成),先經過Vertex Shader的處理,將這些網格資料投射到螢幕平面上,轉換成螢幕上的點位,接著再將這些點位資料交給Fragment Shader,後者會負責去判斷說每個點位分別應該染上什麼顏色。
(簡言之:Vertex Shader先算出 "畫在哪",Fragment Shader再計算 "該畫啥")
那具體來說Shader要怎麼寫?
讓我們先回到我自己常用的Unity上吧,在Unity當中如果要寫Shader的話,你會需要先建立一個Shader (廢話
我們這邊先建立一個最基本的Shader,右鍵然後選Unlit Shader,選其他的話……我也暫時還不知道會怎樣XD
建立完後打開就會看到以下這些東西
……
我想第一次碰Shader的人應該都難免會產生 "這到底三小" 的想法XD不過別急,這邊我們先一個一個簡單地解釋 (畢竟詳細的解釋我也不會QQ)
先解釋一些大項目分別有
-名稱
-屬性
-子Shader
而子Shader當中則還包含了
-標籤(Tags)
-細緻程度(LOD)
-渲染過程(Pass)
接著我們再看看上圖中縮起來的Properties和Pass吧。
先看看屬性欄,Unlit Shader預設Properties當中會先有一個_MainTex的屬性,該屬性在編輯器那裡會顯示出來,並且可以讓開發者自由調動,如果要看到的話我們需要先建立一個材質(Material)
在Unity當中,要顯示一個物件時除了需要Shader外,我們也需要材質(Material),你可以把前者當作是一個渲染的設計藍圖,而後者則是根據該藍圖生出來的實體,能夠自己調整藍圖上的參數。 (不過記得你要在生成Material之後去切換他採用的Shader)
最後我們則可以看到Material上有著剛才Shader宣告的屬性欄位,一個叫Texture的貼圖,並且在還沒有指派任何貼圖之前,他預設的樣子會是白色。
說完了Porperties以及他在編輯器中看到的模樣後,接下來我們就接著繼續看到剛才的Pass部分吧
(fog的那一行我還不了解QQ,不過不是必要的)
Pass的部分算是整個Shader裡面最繁雜的一塊,不過平常有寫過其他程式(如C#,Java)的人現在應該會感覺比較親切一些 (大概)
Pass內部大致可以先分成取什麼資料,再到處理資料,這兩個步驟,讓我們先從取資料的部分看起吧。
(TEXCOORD0根據官方說法,他是第一個UV座標點,但之後的TEXCOORD1那些的我就看不太懂了,有興趣的人可以去研究一下
官方的資料)
這裡我們把uv座標以及頂點的位置提取出來,對前者不熟悉的人,這裡先簡單提一下,UV我自己解釋為貼圖的取樣座標點,貼圖是物體的皮膚(想像一下把一張圖片整個貼在物體表面上),而UV就是去告訴我們,目前這的地方對應到原本貼圖的哪個區域 (例如說一個人的肚臍可能就對應到原本貼圖的0.5,0.5的位置,也就是正中央)
(
圖源,以此圖為例,這裡的貼圖是一張地球的平面圖,然後把這個貼圖貼到一個球體上,並且我們可以帶入uv座標取得貼圖上對應的點)
那說完了準備資料後,接著就該來看看處理的部分了
這裡大致有3個步驟
1.先從Unity那邊取得appdata(依照我們先前宣告的格式取得資料),交給Vertex Shader
2.Vertex Shader將頂點資訊處理完後交給Fragment Shader (這邊將頂點的實際位置轉換成畫面上看到的位置)
3.最後Fragment Shader那邊再根據uv座標印出該位置應該要有的顏色
看懂了之後我們就可以來看看它具體的效果了!
我們先在場景中生成一個球體,然後去更換他對應的材質
(由於目前的材質還沒有給貼圖的關係,所以表面看起來就會是預設的白色,我們可以隨便找張圖來當作他的貼圖)
將江~球體Unity醬 (ㄍ
好啦,感覺這次在講解上寫得有點太囉嗦W而且可能還是不清楚,不過今天就先到這邊吧,希望大家喜歡! 或看的懂W
另外我個人也蠻推薦
這個影片 (雖然長到靠杯),覺得太長的話可以先把前兩個鐘頭看完就好,我覺得算蠻清楚的