文章著做權歸做者全部。轉載請聯繫做者,並在文中註明出處,給出原文連接。
本系列原更新於做者的github博客,這裏給出連接。git
本系列僅用於記錄並分享本身的學習過程,以及學習過程當中遇到的問題,若有錯漏,歡迎討論。(第0章是Shader系列的引導部分,已經有計算機圖形學基本認識、遊戲開發基礎知識、Unity基礎的能夠選擇性跳過。)github
從馮諾依曼到現代計算機,從簡單的計算結果呈現到豐富多彩的視覺體驗,計算機老是在帶給咱們驚喜。而這一切,都離不開計算機圖形學。算法
什麼是計算機圖形學?首先,隨着硬件水平的發展,咱們已經可以支持的最小顯示精度是 Pixel (像素),但僅僅只有精度還遠遠不夠,咱們還須要配套的顯示模式來發揮這一優點,因此,爲了儘量好地呈現畫面,計算機圖形學應運而生。既然咱們已經知道了圖像顯示的最小單位,那麼咱們要作的就是如何把想要呈現的圖像繪製到屏幕的一個個像素點上,也就是柵格化圖像。簡單來講,計算機圖形學就是研究將圖形轉化爲計算機顯示器柵格形式的算法的科學。性能
遊戲老是給咱們帶來最直觀的計算機視覺盛宴,而在這背後,計算機爲咱們作了不少事情。假設如今咱們在玩一款第三人稱RPG遊戲,主角就站在咱們屏幕中間。對於這樣一個簡單的畫面,在計算機內部是如何實現的呢?學習
首先,計算機的精度是有窮的,有窮意味着不連續,因此咱們只能以簡單的、足夠小的平面去近似獲得曲面的效果,在計算機中,一般以三角面或者四邊形爲最小的面元。咱們以三角面爲例,如今咱們已經有了一個三角面,但我不知道它在哪,這個時候,咱們須要一個三維座標系來輔助定位這個面,有了座標系,咱們就知道了這個三角形三個頂點的座標,但僅僅知道頂點位置還不夠。咱們還知道,物體是經過反射光來讓咱們看到的,因此,咱們還須要一個光源,以及一個觀測者(觀測者即虛擬攝像機,呈如今屏幕前的圖像就是他看到的)。如今已經有了觀察者,被觀察物體,還有光,是否是咱們就能夠「看到」圖像了呢?對於現實世界來講,確實能夠,但計算機不行,由於這些都是咱們的假設,計算機所能理解的只有計算。因此,咱們要「計算」出這個物體在哪,觀察者才能看到。怎麼計算呢?首先,虛擬攝像機會基於本身的「視角」在攝像機和物體之間鋪上一張網格(由於計算機的圖像是不連續的,因此不是鋪上平面),視點和圖像連線與網格的交點就是圖像最終顯示出來的樣子,它對應着一個個的像素,這一個步驟,咱們便形象地稱爲柵格化。如今已經知道了三角形基於屏幕的相對位置信息,只要按屏幕比例縮放即可以呈現出圖像了。但僅僅是這樣還不夠,每個步驟都必須等待上一步工做完成後才能夠開始進行,這並不高效,爲了解決這個問題,計算機渲染引入了流水線工做模式,在流水線上,每個階段都有特定的程序和硬件去執行,最後把數據統一發送給下一階段,這也就是咱們一般所說的 Render Pipeline (渲染流水線)。遊戲
如今咱們知道了,屏幕畫面其實就是頂點和片元的 Render (繪製,呈現,渲染)過程,這個過程本質上是一種信息轉換。不能否認,視覺上的衝擊是最直觀的,在遊戲上更是如此,這也是Arts drive us crazy的緣由。ip
遊戲你們都不陌生,但遊戲最重要的是什麼?是最直接迅速的反饋,尤爲是視覺反饋。這又更依賴於強大的渲染技術。但與通常的計算機圖形繪製不一樣,遊戲渲染更注重效率。因爲性能瓶頸,咱們永遠也沒法爲玩家提供最優質的遊戲體驗,但咱們能夠有側重地進行計算,也就是讓計算髮生在最值得計算的地方,或者,使用更高效,但並不必定徹底正確的算法。可能你們會有疑惑,爲何不正確的東西也能夠被推崇呢?在圖形學領域有一句名言: If it seems right, it is. (若是他看起來是對的,那他就是對的。)這實際上是在告訴咱們,沒有絕對的正確的渲染,只有看上去正確的,即使有,但若是它的代價很大,咱們仍然會選擇效率高的經驗模型(如經典光照模型)去計算。這也是爲何咱們偶爾會在一些遊戲鏡頭中看到「穿幫」鏡頭,但這並不影響咱們的遊戲體驗。遊戲開發
相信你們都是被遊戲的精美畫面或者獨特玩法所吸引,進而熱愛遊戲,但願接觸遊戲開發。若是是前者,那麼能夠更深刻地瞭解遊戲美術行業,樂在其中。開發
這裏給出一個書籍資料目錄:get
《3D數學基礎:圖形與遊戲開發》
《Unity Shader入門精要》
《Real-Time Rendering》
《GPU gems》
《Unity Shaders and Effects Cookbook》