2004 年,有3 位年輕人在開發他們的第一款遊戲失利後,決定在丹麥首都哥本哈根建立一家遊戲引擎公司。最初,他們的想法是要讓全世界的開發人員可以使用最少的資源來建立出他們喜歡的遊戲。誰也不曾想到,十年以後,這個當初不起眼的公司已經成為遊戲引擎公司巨頭,而他們的遊戲引擎也成為世界上應用最廣泛的遊戲引擎。沒錯,這個公司就是Unity Technologies,這3 位年輕人分別是公司創始人David Helgason(CEO)、Nicholas Francis(CCO)和Joachim Ante(CTO)。到2014 年,全世界有超過300 多萬的開發者在使用Unity 來開發遊戲,更有6 億玩家在玩由Unity 引擎製作的遊戲。這股「Unity熱」一直持續到現在。
雖然Unity 引擎上手快,操作介面簡單快速,但許多Unity 開發者卻發現,當他們需要在Unity 中實現一些特殊的畫面效果時,常常無從下手。這些畫面效果的實現通常和繪製有關,更實際來說,我們通常需要在Unity 中撰寫一些Unity Shader 檔案來實現它們。一方面,對繪製知識的缺乏和對Shader 的不了解導致很多開發者在這條路上舉步維艱;另一方面,對遊戲畫面的提升是越來越多遊戲公司的訴求。然而,Unity 官方文件中不僅缺少對繪製原理說明的內容,對Unity Shader 本身的一些工作機制(概括來說,Unity Shader 是Shader 上層的抽象)同樣缺少相關資料。同時,市面上能提供初學者參考的Unity Shader 書少之又少,基於這些原因,使得我想要撰寫這樣一本書來幫助開發者渡過困境。
本書從基礎開始,幫助讀者逐漸了解並掌握如何撰寫Unity Shader。不僅要教會讀者「如何使用Unity Shader」,更重要的是要幫助讀者建立對繪製流程的基本認識,在此基礎上,幫助讀者學習Unity 中的一些繪製機制以及如何使用Unity Shader 實現各種自訂的繪製效果。我相信,讓讀者先了解原理再進行實作,相比於大量堆砌程式是更好的學習方法。因此,本書在開始實作前,均會為讀者說明大量的原理,讓讀者在學習時不再一頭霧水。
儘管本書專注於學習Unity Shader,但根據我的學習經驗來看,在不了解基礎的繪製流程和基本的數學知識前,想要深入學習Shader 的撰寫是非常困難的。實際上,Shader 僅是整個繪製流程的子部分,任何脫離繪製流程對Shader的說明可能會讓讀者更加困惑。而向量運算、矩陣轉換等數學知識在Shader的撰寫中無處不在,這些數學知識常常也是讓初學者對Shader 望而卻步的原因。以上面為基礎的兩點觀察,本書的安排從易到難,由基礎到深入。我們把全書分為5 篇,讀者可以在第1 章中看到這些章節的實際安排。
隨著硬體的發展,Shader 的能力也越來越大。如果問你,一個Shader 可以做什麼?你可能會回答繪製遊戲模型、模擬波動的海面、實現各種螢幕特效等。讀者可以在Shadertoy 網站上看到許多的實例。例如,上面的小雨傘、五彩的小方塊,以及飄動的氣球(由於本書是黑白印刷,一些效果無法顯現)。一個簡簡單單的Shader 可以做到什麼程度的效果,我們已經不可預期。本書的重點不在於教讀者如何單純使用Shader 來實現上面的效果,而在於如何讓Shader 和其他遊戲開發元素(例如,模型、紋理、指令稿等)相配合,實現遊戲中常見的繪製效果,我們在此只想說明Shader 可能遠比你想像的要強大得多。我們真誠地希望本書可以帶領讀者走進Shader 的世界,讓讀者了解Shader、掌握Shader,和我們一起享受這樣一個奇妙的遊戲開發世界!
讀這本書之前你需要哪些知識
本書針對Unity Shader 初學者和程式設計師,儘量在本書的基礎篇中介紹那些必要的基礎知識,但仍然希望讀者可以具備以下知識。
■有(或少量)程式設計經驗。儘管Unity Shader 的撰寫語言不同於C++、C# 這種高階語言,但相比於完全沒有程式設計經驗的讀者來說,學習過這些高階語言的讀者更加容易了解Shader 的程式。例如,什麼是變數、什麼是函數等。對於那些缺少程式設計經驗但仍對Shader 有濃厚興趣的讀者,一個好消息是,在Unity 的幫助下,撰寫Unity Shader 的程式量並不多,因此,這些讀者仍然可以閱讀本書。
■對Unity 引擎的操作介面比較熟悉。假設讀者曾使用過一段時間的Unity,對其中的一些基本操作已經掌握。例如,如何建立場景、指令稿和遊戲物件等。
■保持一定的耐心。我曾聽到身邊的一些朋友抱怨,為什麼總是看不懂、學不會Shader,難道是自己學習能力有問題嗎?實際上,這些朋友大多對Shader的學習缺乏耐心,總是抱著今天看一下明天就會的心情。但不幸的是,與C++、C# 高階語言相比,就算我們成功撰寫了Shader 版的「Hello world」,但對於為什麼要這麼寫、它們是怎麼執行的等一系列基礎問題我們仍然並不了解。這正是我之前提到的,要想徹底了解Shader,就必須了解整個繪製管線的工作方式。因此,保持耐心,打好基礎,是每一個想要深入學習Shader的開發者的必經之路。
■有一定的數學基礎,包含了解基本的代數運算(如結合律、交換律等)、三角運算(如正弦、餘弦計算等)。除此之外,如果具有大專程度的線性代數、微積分等數學知識,會發現閱讀本書時會更加容易。為了幫助讀者學習Shader 中常見的數學運算,第4 章將介紹向量、矩陣、空間轉換等重要的數學內容。
如果你具備上面幾點小小的條件,那麼恭喜你,現在你可以安心地繼續閱讀本書了!
雖然Unity 引擎上手快,操作介面簡單快速,但許多Unity 開發者卻發現,當他們需要在Unity 中實現一些特殊的畫面效果時,常常無從下手。這些畫面效果的實現通常和繪製有關,更實際來說,我們通常需要在Unity 中撰寫一些Unity Shader 檔案來實現它們。一方面,對繪製知識的缺乏和對Shader 的不了解導致很多開發者在這條路上舉步維艱;另一方面,對遊戲畫面的提升是越來越多遊戲公司的訴求。然而,Unity 官方文件中不僅缺少對繪製原理說明的內容,對Unity Shader 本身的一些工作機制(概括來說,Unity Shader 是Shader 上層的抽象)同樣缺少相關資料。同時,市面上能提供初學者參考的Unity Shader 書少之又少,基於這些原因,使得我想要撰寫這樣一本書來幫助開發者渡過困境。
本書從基礎開始,幫助讀者逐漸了解並掌握如何撰寫Unity Shader。不僅要教會讀者「如何使用Unity Shader」,更重要的是要幫助讀者建立對繪製流程的基本認識,在此基礎上,幫助讀者學習Unity 中的一些繪製機制以及如何使用Unity Shader 實現各種自訂的繪製效果。我相信,讓讀者先了解原理再進行實作,相比於大量堆砌程式是更好的學習方法。因此,本書在開始實作前,均會為讀者說明大量的原理,讓讀者在學習時不再一頭霧水。
儘管本書專注於學習Unity Shader,但根據我的學習經驗來看,在不了解基礎的繪製流程和基本的數學知識前,想要深入學習Shader 的撰寫是非常困難的。實際上,Shader 僅是整個繪製流程的子部分,任何脫離繪製流程對Shader的說明可能會讓讀者更加困惑。而向量運算、矩陣轉換等數學知識在Shader的撰寫中無處不在,這些數學知識常常也是讓初學者對Shader 望而卻步的原因。以上面為基礎的兩點觀察,本書的安排從易到難,由基礎到深入。我們把全書分為5 篇,讀者可以在第1 章中看到這些章節的實際安排。
隨著硬體的發展,Shader 的能力也越來越大。如果問你,一個Shader 可以做什麼?你可能會回答繪製遊戲模型、模擬波動的海面、實現各種螢幕特效等。讀者可以在Shadertoy 網站上看到許多的實例。例如,上面的小雨傘、五彩的小方塊,以及飄動的氣球(由於本書是黑白印刷,一些效果無法顯現)。一個簡簡單單的Shader 可以做到什麼程度的效果,我們已經不可預期。本書的重點不在於教讀者如何單純使用Shader 來實現上面的效果,而在於如何讓Shader 和其他遊戲開發元素(例如,模型、紋理、指令稿等)相配合,實現遊戲中常見的繪製效果,我們在此只想說明Shader 可能遠比你想像的要強大得多。我們真誠地希望本書可以帶領讀者走進Shader 的世界,讓讀者了解Shader、掌握Shader,和我們一起享受這樣一個奇妙的遊戲開發世界!
讀這本書之前你需要哪些知識
本書針對Unity Shader 初學者和程式設計師,儘量在本書的基礎篇中介紹那些必要的基礎知識,但仍然希望讀者可以具備以下知識。
■有(或少量)程式設計經驗。儘管Unity Shader 的撰寫語言不同於C++、C# 這種高階語言,但相比於完全沒有程式設計經驗的讀者來說,學習過這些高階語言的讀者更加容易了解Shader 的程式。例如,什麼是變數、什麼是函數等。對於那些缺少程式設計經驗但仍對Shader 有濃厚興趣的讀者,一個好消息是,在Unity 的幫助下,撰寫Unity Shader 的程式量並不多,因此,這些讀者仍然可以閱讀本書。
■對Unity 引擎的操作介面比較熟悉。假設讀者曾使用過一段時間的Unity,對其中的一些基本操作已經掌握。例如,如何建立場景、指令稿和遊戲物件等。
■保持一定的耐心。我曾聽到身邊的一些朋友抱怨,為什麼總是看不懂、學不會Shader,難道是自己學習能力有問題嗎?實際上,這些朋友大多對Shader的學習缺乏耐心,總是抱著今天看一下明天就會的心情。但不幸的是,與C++、C# 高階語言相比,就算我們成功撰寫了Shader 版的「Hello world」,但對於為什麼要這麼寫、它們是怎麼執行的等一系列基礎問題我們仍然並不了解。這正是我之前提到的,要想徹底了解Shader,就必須了解整個繪製管線的工作方式。因此,保持耐心,打好基礎,是每一個想要深入學習Shader的開發者的必經之路。
■有一定的數學基礎,包含了解基本的代數運算(如結合律、交換律等)、三角運算(如正弦、餘弦計算等)。除此之外,如果具有大專程度的線性代數、微積分等數學知識,會發現閱讀本書時會更加容易。為了幫助讀者學習Shader 中常見的數學運算,第4 章將介紹向量、矩陣、空間轉換等重要的數學內容。
如果你具備上面幾點小小的條件,那麼恭喜你,現在你可以安心地繼續閱讀本書了!