本書特色
■ 內容獨特 填補Unity Shader 和繪製管線之間的知識鴻溝,對Unity 一些繪製機制的工作原理進行詳細剖析。配合大量實例,讓讀者在實作中逐漸掌握UnityShader 的撰寫。
■ 結構連貫 從基礎到進階再到深入的說明,解決讀者長期以來的學習煩惱。
■ 充分針對初學者 提供大量的圖示並配合文字說明,且一些章節最後提供「答疑解惑」來解釋初學者經常遇到的問題。
■ 包含Unity 5 在繪製方面的新內容 多次介紹Unity 5 中的新工具頁框偵錯器(Frame Debugger),並借助該工具的幫助來了解Unity中的繪製過程
■ 補充大量延伸閱讀資料 在本書一些章節的最後,提供「擴充閱讀」,讓那些希望更加深入學習的讀者可以在提供的資料中找到更多的學習內容。
適用: 想要了解繪製基礎或更自由地使用Unity Shader 撰寫繪製效果的開發者
作者序
前 言
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 章將介紹向量、矩陣、空間轉換等重要的數學內容。
如果你具備上面幾點小小的條件,那麼恭喜你,現在你可以安心地繼續閱讀本書了!
前 言
2004 年,有3 位年輕人在開發他們的第一款遊戲失利後,決定在丹麥首都哥本哈根建立一家遊戲引擎公司。最初,他們的想法是要讓全世界的開發人員可以使用最少的資源來建立出他們喜歡的遊戲。誰也不曾想到,十年以後,這個當初不起眼的公司已經成為遊戲引擎公司巨頭,而他們的遊戲引擎也成為世界上應用最廣泛的遊戲引擎。沒錯,這個公司就是Unity Technologies,這3 位年輕人分別是公司創始人David Helgason(CEO)、Nicholas Francis(CCO)和Joachim Ante(CTO)。到2014 年,全世界有超過300 多萬的開發者在使用Unity 來開發遊戲,...
目錄
01 基礎篇
第1 章 歡迎來到Shader 的世界
1.1 程式設計師的三大浪漫
1.2 本書結構
第2 章 繪製管線
2.1 整體說明
2.2 CPU 和GPU 之間的通訊
2.3 GPU 管線
2.4 一些容易困惑的地方
2.5 你明白Shader 了嗎
2.6 擴充閱讀
第3 章 Unity Shader 基礎
3.1 Unity Shader 概述
3.2 Unity Shader 的基礎:ShaderLab
3.3 Unity Shader 的結構
3.4 Unity Shader 的形式
3.5 本書使用的Unity Shader形式
3.6 答疑解惑
3.7 擴充閱讀
第4 章 學習Shader 所需的數學基礎
4.1 背景:農場遊戲
4.2 笛卡兒座標系
4.3 點和向量
4.4 矩陣
4.5 矩陣的幾何意義:轉換
4.6 座標空間
4.7 法線轉換
4.8 Unity Shader 的內建變數(數學篇)
4.9 答疑解惑
4.10 擴充閱讀
4.11 練習題解答
02 初級篇
第5 章 開始Unity Shader 學習之旅
5.1 本書使用的軟體和環境
5.2 一個最簡單的頂點/ 片段著色器
5.3 強大的援手:Unity 提供的內建檔案和變數
5.4 Unity 提供的Cg/HLSL 語義
5.5 程式設計師的煩惱:Debug
5.6 小心:繪製平台的差異
5.7 Shader 整潔之道
5.8 擴充閱讀
第6 章 Unity 中的基礎光源
6.1 我們是如何看到這個世界的
6.2 標準光源模型
6.3 Unity 中的環境光和自發光
6.4 在Unity Shader 中實現漫射光源模型
6.5 在Unity Shader 中實現高光反射光源模型
6.6 召喚神龍:使用Unity 內建的函數
第7 章 基礎紋理
7.1 單張紋理
7.2 凹凸對映
7.3 漸層紋理
7.4 隱藏紋理
第8 章 透明效果
8.1 為什麼繪製順序很重要
8.2 Unity Shader 的繪製順序
8.3 透明度測試
8.4 透明度混合
8.5 開啟深度寫入的半透明效果
8.6 ShaderLab 的混合指令
8.7 雙面繪製的透明效果
03 中級篇
第9 章 更複雜的光源
9.1 Unity 的繪製路徑
9.2 Unity 的光源類型
9.3 Unity 的光源衰減
9.4 Unity 的陰影
9.5 本書使用的標準Unity Shader
第10 章 進階紋理
10.1 立方體紋理
10.2 繪製紋理
10.3 程式紋理
第11 章 讓畫面動起來
11.1 Unity Shader 中的內建變數(時間篇)
11.2 紋理動畫
11.3 頂點動畫
04 高級篇
第12 章 螢幕後製處理效果
12.1 建立一個基本的螢幕後製處理指令稿系統
12.2 調整螢幕的亮度、飽和度和比較度
12.3 邊緣檢測
12.4 高斯模糊
12.5 Bloom 效果
12.6 運動模糊
12.7 擴充閱讀
第13 章 使用深度和法線紋理
13.1 取得深度和法線紋理
13.2 再談運動模糊
13.3 全域霧效
13.4 再談邊緣檢測
13.5 擴充閱讀
第14 章 非真實感繪製
14.1 卡通風格的繪製
14.2 素描風格的繪製
14.3 擴充閱讀
14.4 參考文獻
第15 章 使用雜訊
15.1 消融效果
15.2 水波效果
15.3 再談全域霧效
15.4 擴充閱讀
15.5 參考文獻
第16 章 Unity 中的繪製最佳化技術
16.1 行動平台的特點
16.2 影響效能的因素
16.3 Unity 中的繪製分析工具
16.4 減少draw call 數目
16.5 減少需要處理的頂點數目
16.6 減少需要處理的片段數目
16.7 節省頻寬
16.8 減少計算複雜度
16.9 擴充閱讀
05 擴充篇
第17 章 Unity 的表面著色器探秘
17.1 表面著色器的實例
17.2 編譯指令
17.3 兩個結構
17.4 Unity 背後做了什麼
17.5 表面著色器實例分析
17.6 Surface Shader 的缺點
第18 章 以實體為基礎的繪製
18.1 PBS 的理論和數學基礎
18.2 Unity 5 的Standard Shader
18.3 一個更加複雜的實例
18.4 答疑解惑
18.5 擴充閱讀
18.6 參考文獻
第19 章 Unity 5 更新了什麼
19.1 場景「更亮了」
19.2 表面著色器更容易「顯示出錯了」
19.3 當家做主:自己控制非統一縮放的網格
19.4 固定管線著色器逐漸退出舞台
第20 章 還有更多內容嗎
20.1 如果你想深入了解繪製
20.2 世界那麼大
20.3 參考文獻
01 基礎篇
第1 章 歡迎來到Shader 的世界
1.1 程式設計師的三大浪漫
1.2 本書結構
第2 章 繪製管線
2.1 整體說明
2.2 CPU 和GPU 之間的通訊
2.3 GPU 管線
2.4 一些容易困惑的地方
2.5 你明白Shader 了嗎
2.6 擴充閱讀
第3 章 Unity Shader 基礎
3.1 Unity Shader 概述
3.2 Unity Shader 的基礎:ShaderLab
3.3 Unity Shader 的結構
3.4 Unity Shader 的形式
3.5 本書使用的Unity Shader形式
3.6 答疑解惑
3.7 擴充閱讀
第4 章 學習Shader 所需的數學基礎
4.1 背景:農場遊戲
4.2 笛卡兒座標系
4.3 點和向量
...
購物須知
關於二手書說明:
商品建檔資料為新書及二手書共用,因是二手商品,實際狀況可能已與建檔資料有差異,購買二手書時,請務必檢視商品書況、備註說明及書況影片,收到商品將以書況影片內呈現為準。若有差異時僅可提供退貨處理,無法換貨或再補寄。
商品版權法律說明:
TAAZE 單純提供網路二手書託售平台予消費者,並不涉入書本作者與原出版商間之任何糾紛;敬請各界鑒察。
退換貨說明:
二手書籍商品享有10天的商品猶豫期(含例假日)。若您欲辦理退貨,請於取得該商品10日內寄回。
二手影音商品(例如CD、DVD等),恕不提供10天猶豫期退貨。
二手商品無法提供換貨服務,僅能辦理退貨。如須退貨,請保持該商品及其附件的完整性(包含書籍封底之TAAZE物流條碼)。若退回商品無法回復原狀者,可能影響退換貨權利之行使或須負擔部分費用。
訂購本商品前請務必詳閱
退換貨原則、
二手CD、DVD退換貨說明。