Unity 3D ShaderLab 開發實戰詳解(第3版)

Unity 3D ShaderLab 開發實戰詳解(第3版)

《Unity 3D ShaderLab 開發實戰詳解(第3版)》是2019年11月人民郵電出版社出版的圖書,作者是郭浩瑜、張鶴。

基本介紹

  • 書名:Unity 3D ShaderLab 開發實戰詳解(第3版)
  • 作者:郭浩瑜、張鶴
  • 出版社:人民郵電出版社
  • 出版時間:2019年11月
  • 頁數:251 頁
  • 定價:79 元
  • 開本:16 開
  • 裝幀:平裝
  • ISBN:9787115505408
內容簡介,圖書目錄,

內容簡介

本書全面講解了Unity Shader渲染的實用技術,分為5篇,共31章。主要內容有著色器的概念和渲染流水線,渲染原理和圖形存儲器,Unity中著色器的形態,著色器中用到的各種空間概念,基本的光照模型,通道,前向渲染路徑,基於光照貼圖的烘焙照明,柔和的低頻照明,各種陰影,通道的通用指令開關,固定流水線,表面著色器,常用的材質,霧的計算,物體的分割,自定義光源,高級效果,以及著色器的組織和復用,渲染最佳化等。
本書適合移動開發者、遊戲開發者、程式設計師閱讀,也可作為大專院校相關專業的師生用書以及培訓學校的教材。

圖書目錄

第 1篇 初識廬山真面目—
Unity 3D著色器
第 1章 著色器的概念和渲染流水線 2
1.1 著色器的概念 2
1.1.1 虛擬世界中的光明和色彩 2
1.1.2 遊戲開發人員的巔峰 2
1.1.3 著色器簡史 2
1.1.4 著色器的實例化 3
1.1.5 著色器的實現語言 3
1.1.6 Unity中的著色器編程 4
1.2 渲染流水線 4
1.2.1 渲染流水線簡介 4
1.2.2 渲染流水線階段 5
1.3 渲染流水線執行階段 6
1.3.1 輸入裝配階段 6
1.3.2 頂點著色器 8
1.3.3 細化階段 8
1.3.4 幾何著色器 9
1.3.5 流輸出階段 10
1.3.6 片元著色器 10
1.3.7 輸出合併階段 11
1.4 其他一些細節 11
1.4.1 延遲渲染和前向渲染 11
1.4.2 批次合併渲染 13
第 2章 渲染原理和圖形存儲器 14
2.1 渲染原理 14
2.1.1 立即模式渲染 14
2.1.2 基於區塊的(延遲)渲染 16
2.2 圖形存儲器 18
2.2.1 GPU的存儲系統層次體系 19
2.2.2 數據結構 20
2.2.3 渲染所需的數據結構 23
2.2.4 合併批次渲染原理回顧 23
第3章 Unity中著色器的形態 25
3.1 Unity通過ShaderLab來組織著色器 25
3.1.1 關鍵字Shader 25
3.1.2 使用子著色器組織著色器的
不同實現 25
3.1.3 子著色器的重要標籤 25
3.1.4 子著色器中的Pass塊 26
3.1.5 Pass塊的標籤及其名字的
意義 26
3.1.6 使用FallBack語句保證
著色器的廣泛適應性 27
3.2 Unity支持的著色器程式語言 27
3.3 Unity中著色器的3種形態 27
3.3.1 固定流水線 27
3.3.2 可程式著色器 28
3.3.3 ShaderLab中的表面著色器 29
3.4 著色器的數據接口—屬性和uniform
變數 31
3.4.1 在Properties塊中定義屬性 31
3.4.2 通過圖形界面操作屬性 31
3.4.3 通過腳本操控屬性 31
3.4.4 矩陣—不能在屬性塊中
定義的變數 32
3.4.5 在Cg代碼中使用屬性 32
第4章 著色器中用到的各種空間概念 33
4.1 模型空間 33
4.1.1 為什麼用模型空間 33
4.1.2 在腳本和著色器中進出模型
空間 33
4.2 世界坐標空間 33
4.2.1 統一的坐標空間—世界坐標
空間 33
4.2.2 在腳本和著色器中進出世界
坐標空間 34
4.3 視空間 34
4.3.1 渲染的需要—視空間 34
4.3.2 在腳本和著色器中進出視
空間 34
4.4 空間的一塊—視錐體 34
4.5 剪下空間 35
4.5.1 投影 35
4.5.2 腳本和著色器中的投影矩陣 35
4.5.3 驗證NDC 35
4.6 NDC之後 36
第5章 基本的光照模型 37
5.1 光源對物體照明的分類 37
5.1.1 間接照明 37
5.1.2 直接照明 37
5.2 亮度的計算方式—光照模型 37
5.2.1 漫反射和Lambert 37
5.2.2 鏡面高光和Phong 38
5.2.3 半角向量和BlinnPhong 38
第 2篇 讓套用更炫彩—
Unity中的照明
第6章 第 一個執行的通道 42
6.1 不同的LightMode被選擇的順序 42
6.1.1 渲染路徑和通道的LightMode標籤 42
6.1.2 設計可以檢測渲染路徑的
材質 42
6.1.3 設計便於檢測渲染路徑的
場景 43
6.1.4 觀察那些渲染的通道 43
6.2 3個渲染路徑之外的處理方式 45
6.2.1 LightMode的其他值 45
6.2.2 設計檢測用的材質 45
第7章 前向渲染路徑 47
7.1 渲染物體—ForwardBase和
ForwardAdd 47
7.1.1 設計檢測用的場景和材質 47
7.1.2 ForwardBase和ForwardAdd的
表現 48
7.2 前向渲染路徑下的光源 48
7.2.1 設計檢測用的材質 48
7.2.2 光源的情況 48
7.2.3 Unity如何為前向渲染路徑
設定光源 49
第8章 基於光照貼圖的烘焙照明 50
8.1 烘焙的維度和屬性矩陣 50
8.2 光照貼圖 50
8.2.1 測試烘焙的場景 51
8.2.2 烘焙之後的場景 52
8.2.3 雙光照貼圖 52
8.3 在效果和性能間進行權衡 52
8.3.1 影響全局的Resolution選項 53
8.3.2 單個物體的選項 53
第9章 柔和的低頻照明 55
9.1 初識光照探頭 55
9.1.1 光照探頭照明的優點 55
9.1.2 檢測光照探頭照明的場景 55
9.1.3 使用光照探頭組進行管理 57
9.1.4 烘焙場景光照信息到光照
探頭中 57
9.1.5 對比光照探頭照明和實時
照明 58
9.2 放置光照探頭的注意事項 59
9.2.1 必須形成一個體積 59
9.2.2 單個光照探頭必須處於採樣
光源的照射範圍 59
9.3 照明採樣的Anchor Override 59
9.3.1 動態更新光照探頭 59
9.3.2 基於線性插值的採樣 59
9.3.3 改變默認的插值位置 59
9.4 光照探頭照明和陰影 60
9.4.1 光照探頭和光照貼圖的
異同 60
9.4.2 烘焙陰影時可能會犯的錯誤 61
9.4.3 將靜態物體的陰影烘焙到
光照探頭上 61
9.4.4 光照探頭照明和實時陰影的
混合 62
9.5 烘焙一個色彩豐富的場景 62
9.6 在自己的材質中使用光照探頭 63
9.6.1 為前向渲染路徑中的材質計算
光照探頭 63
9.6.2 使用ShadeSH9函式 64
9.6.3 在一個表面著色器中進行
計算 65
9.7 LPPV的設計目的 66
9.7.1 LPPV是什麼 66
9.7.2 照明的場景 66
第3篇 使套用更逼真—陰影
第 10章 平面陰影 70
10.1 平行光對平面的投影 70
10.1.1 對平行光投影的考慮 70
10.1.2 進出陰影接受平面的矩陣 70
10.1.3 使用三角形相似計算陰影 71
10.2 點光源對平面的投影 72
10.3 陰影的淡出 73
10.3.1 有效利用平面陰影計算
過程中的數據 73
10.3.2 潛在的問題 74
第 11章 球體陰影 75
11.1 平行光對球體的投影 75
11.1.1 投影球體的信息 75
11.1.2 使用相似三角形計算投影 75
11.2 陰影的淡入/淡出 76
11.3 點光源對球體的投影 77
第 12章 體積陰影 78
12.1 將頂點沿某一方向擠出 78
12.1.1 在Vertex函式中操作 78
12.1.2 判斷頂點是向光還是背光 79
12.2 從體積中找到陰影區域 79
12.2.1 兩次擠出 79
12.2.2 計算出陰影區域 80
12.2.3 渲染陰影 80
12.2.4 需要注意的問題 80
第 13章 陰影映射 82
13.1 燈光空間和相機空間 82
13.1.1 觀察兩個空間 82
13.1.2 兩個視角的Z深度 82
13.1.3 渲染Z深度的材質 83
13.2 投射Z深度 83
13.2.1 準備燈光視角的投影矩陣 83
13.2.2 在材質中計算投影后的Z
深度 84
13.3 比較Z深度 85
13.3.1 比較Z深度的材質 85
13.3.2 Z深度的精度引起的問題 87
13.3.3 提高Z深度的精度 87
13.3.4 對Z深度值進行偏移 88
第 14章 內置的陰影 89
14.1 Unity實時陰影的原理 89
14.1.1 基本原理 89
14.1.2 軟陰影 89
14.2 投射陰影 90
14.2.1 使用ShadowCaster投射
陰影 90
14.2.2 在ShadowCaster里都做了
什麼 91
14.2.3 寫一個自己的ShadowCaster 91
14.2.4 改變ShadowCaster的行為 92
14.2.5 陰影和FallBack機制 92
14.3 接受陰影 94
14.4 表面著色器和陰影 94
14.4.1 表面著色器的陰影和
Fallback 94
14.4.2 表面著色器里的燈光參數和
陰影 95
14.4.3 表面著色器對前向渲染路徑下
陰影的支持 95
14.5 陰影的批處理 96
14.5.1 批處理陰影的好處 96
14.5.2 簡單的Caster 97
14.5.3 靜態陰影的批處理 98
14.5.4 動態陰影的批處理 100
第4篇 Unity中的各種著色器
第 15章 通道的通用指令開關 104
15.1 使用LOD在運行時決定材質 104
15.1.1 材質的LOD 104
15.1.2 在運行時設定單個材質的
LOD 104
15.1.3 設定全局所有材質的
LOD 105
15.2 渲染佇列 106
15.2.1 標籤佇列和渲染順序 106
15.2.2 渲染佇列和ZTest判斷 107
15.2.3 Unity中內置的渲染佇列 107
15.2.4 一個利用渲染佇列的例子 107
15.3 透明的產生 108
15.3.1 Alpha檢測和8種比較
條件 108
15.3.2 生成著色器的內容 108
15.3.3 結合AlphaTest和Blend
操作 109
15.4 混合操作及其套用 110
15.4.1 混合操作 110
15.4.2 生成著色器的代碼 110
15.4.3 檢測不同的混合操作 110
15.4.4 BlendOp選項 111
15.4.5 檢測BlendOp操作 112
15.4.6 兩個使用Blend生成的
效果 112
15.5 使用ColorMask 114
15.5.1 ColorMask的作用 114
15.5.2 檢測ColorMask 114
15.5.3 一個使用ColorMask的
例子 115
15.6 深度測試 116
15.6.1 存取場景的深度測試 116
15.6.2 RenderType標籤和與生成
深度測試的關聯 116
15.6.3 內置RenderType的值 117
15.6.4 前向渲染路徑下的
深度測試 117
15.7 Z深度的偏移量 118
15.7.1 干預正常深度測試的手段 118
15.7.2 觀察偏移量在不同套用
條件下的表現 118
15.8 面的剔除操作 118
15.9 自動生成貼圖的坐標 119
15.9.1 ObjectLinear和等價的
Cg代碼 119
15.9.2 EyeLinear和等價的
Cg代碼 120
15.9.3 SphereMap和等價的
Cg代碼 121
15.9.4 CubeReflect和等價的
Cg代碼 122
15.9.5 CubeNormal和等價的
Cg代碼 122
15.10 抓屏操作 123
15.10.1 如何使用GrabPass 123
15.10.2 一個模擬曲面反射的
例子 124
15.11 霧效 124
15.11.1 霧效和Unity的3種
實現 124
15.11.2 材質中對霧效的控制 125
15.11.3 實現自己的霧效 126
15.12 蒙版 128
15.12.1 蒙版測試、Z深度和
15.12.2 使用蒙版測試改變渲染
結果 128
15.12.3 綜合使用蒙版和佇列 128
第 16章 固定流水線 130
16.1 Unity中的固定流水線 130
16.1.1 固定流水線基本形態 130
16.1.2 與照明相關的Material塊 130
16.1.3 處理紋理的SetTexture塊 131
16.1.4 流水線基本形態的另一種
寫法 131
16.1.5 Combine語句 131
16.2 使用頂點色 132
16.2.1 使用ColorMaterial 132
16.2.2 使用Bind 132
16.3 在固定流水線中使用光照貼圖 132
16.4 嵌套Cg代碼 133
第 17章 表面著色器 134
17.1 表面著色器的適應性 134
17.1.1 一個分析策略 134
17.1.2 測試用的場景 134
17.1.3 檢測結果 135
17.2 延遲渲染和GeoBuffer 135
17.3 表面著色器的特殊性 136
17.3.1 表面著色器的混合和透明 136
17.3.2 自定義Vertex函式 137
第 18章 凹凸材質 139
18.1 切空間 139
18.2 凹凸貼圖 139
18.2.1 計算到切空間的矩陣 139
18.2.2 Unity中法線貼圖的壓縮
格式 140
18.2.3 使用切空間矩陣的另一種
方法 140
18.2.4 Unity對切空間計算的
支持 141
18.2.5 解壓縮法線貼圖的函式 141
18.2.6 在切空間中計算高光 142
18.2.7 表面著色器和切空間 142
18.3 視差映射 143
18.3.1 視差映射及其別名 143
18.3.2 一個使用灰度圖來
偏移UV的材質 143
18.3.3 結合法線貼圖 145
18.3.4 用視角來決定UV偏移量 145
18.3.5 一個完整的實現 146
18.4 地勢映射 147
18.4.1 視差映射的極限和地勢映射的
面世 147
18.4.2 地勢映射的算法 148
18.4.3 一個完整的實現 148
第 19章 卡通材質 151
19.1 描邊 151
19.1.1 沿法線擠出輪廓 151
19.1.2 容易產生的問題 152
19.1.3 在視空間中擠出 152
19.1.4 頂點位置的另一個含義 153
19.1.5 調和法線和頂點方向 154
19.1.6 判斷頂點的指向 154
19.1.7 不僅僅是輪廓 155
19.1.8 通過Z偏移量來描邊 158
19.2 卡通著色 158
19.2.1 對光照進行離散化 158
19.2.2 使用2D貼圖重新映射
光照 160
第 20章 鏡面材質 162
20.1 鏡像一個相機 162
20.1.1 鏡子裡的世界和我的計畫 162
20.1.2 在腳本中對位置和角度進行
鏡像 162
20.2 使用鏡像相機來渲染和投影 163
20.2.1 鏡面材質的工作—採樣被
投影的渲染結果 163
20.2.2 腳本的工作—渲染鏡像相機
和設定投影矩陣 164
20.3 鏡像相機的近剪下平面和
傾斜矩陣 164
20.3.1 調節近剪下平面 164
20.3.2 使用傾斜矩陣微調視錐體 165
第 21章 透明和半透明材質 166
21.1 半透明材質 166
21.2 化繁為簡 166
21.3 透明材質 167
第 22章 體積霧 170
22.1 距離的表達—相對於背景的
體積霧 170
22.1.1 需要計算的東西 170
22.1.2 使用一個通道來完成所有的
計算 170
22.1.3 黑色的霧效 171
22.2 厚度的表達—物體形體的
體積霧 172
22.2.1 必須計算的兩個數據 172
22.2.2 在Unity中使用一個通道來
完成所有計算 172
第 23章 面積光 175
23.1 線光源 175
23.1.1 點、線、面 175
23.1.2 如何理解一個線光源 175
23.1.3 通過腳本傳遞線光源的
幾何信息 175
23.1.4 計算線光源的照明 176
23.1.5 線光源的輻射方向 177
23.1.6 線光源的衰減 178
23.2 面積光源 179
23.2.1 面積光和線光源的不同 179
23.2.2 通過腳本設定面積光的
幾何特性 179
23.2.3 計算面積光 179
23.2.4 和默認照明的整合 181
第 24章 體積光 183
24.1 體積光和體積陰影 183
24.1.1 體積光 183
24.1.2 體積光和體積陰影的關係 183
24.2 實現體積光 183
24.2.1 在著色器中表現體積光 183
24.2.2 腳本的幫助 184
第 25章 材質替代渲染 186
25.1 相機和渲染訊息 186
25.1.1 相機的渲染訊息傳送順序 186
25.1.2 最後能改變Cull操作結果的
地方 186
25.1.3 最後能設定材質數據的
地方 187
25.2 如何使用RenderWithShader方法 187
25.2.1 標籤值不同的5個著色器 187
25.2.2 調用RenderWithShader
方法的腳本 189
25.2.3 替換用的5個材質 190
25.2.4 檢測RenderWithShader
方法的效果 191
25.2.5 使用子著色器組織替代
材質 191
25.2.6 如何設定替代材質的屬性 192
25.2.7 將結果輸出到螢幕上 192
25.3 SetReplacementShader和
ResetReplacementShader與
RenderWithShader方法的異同 193
第 26章 後期效果 194
26.1 Graphics的兩個方法 194
26.1.1 與相機渲染方法的不同
之處 194
26.1.2 Blit方法的簡單示例 194
26.1.3 使用BlitMultiTap方法進行
多重採樣 195
26.2 一個簡單的調色 199
26.2.1 調色用的腳本 199
26.2.2 調色用的材質 200
26.2.3 更高效的做法 201
26.3 景深 203
26.3.1 用於模糊圖像的材質 203
26.3.2 進行縱橫兩次模糊操作 204
26.3.3 進行混合操作的腳本 204
26.3.4 進行混合操作的材質 205
26.3.5 提供一個可調節參數 206
26.4 輪廓檢測 206
26.4.1 用腳本獲得場景的Z深度和
法線 207
26.4.2 在材質中進行邊緣檢測 207
26.5 扭曲 208
26.5.1 通過UV操作扭曲圖像 208
26.5.2 限定扭曲的區域 209
26.5.3 使用物體來做遮罩 210
26.6 運動模糊 213
26.6.1 如何記錄運動軌跡 213
26.6.2 實現運動模糊的材質 213
26.6.3 用於完成整個過程的腳本 214
26.6.4 通過Alpha和幀的混合操作
實現運動模糊 215
26.7 噪波 215
26.7.1 根據Z深度來混合噪波 216
26.7.2 根據明暗程度來混合噪波 217
26.8 色彩的溢出 217
26.8.1 色彩溢出的算法考量 218
26.8.2 實現色彩溢出的採樣計算 218
第 27章 投影 220
27.1 Unity的Projector 220
27.1.1 Projector中材質的執行
順序 220
27.1.2 如何寫Projector使用的
材質 220
27.1.3 控制投影淡進淡出的矩陣 221
27.2 實現自己的投影 222
27.2.1 設定投影矩陣的腳本 222
27.2.2 採樣投影的材質 223
27.2.3 直接投影到螢幕上 224
第 28章 分割一個物體 225
28.1 分割一個物體的思路 225
28.1.1 我們需要什麼樣的信息 225
28.1.2 腳本的幫助 225
28.2 在著色器中剪下一個物體 225
第5篇 著色器的組織和最佳化
第 29章 著色器的組織和復用 228
29.1 cginc檔案 228
29.1.1 Unity的UnityCG.cginc
檔案 228
29.1.2 定義自己的cginc檔案 228
29.1.3 使用自定義的cginc檔案 229
29.2 通過UsePass來復用通道 229
29.2.1 定義自己要復用的通道 229
29.2.2 復用這些通道 230
29.3 定義著色器的關鍵字 231
29.3.1 使用關鍵字改變著色器的
行為 231
29.3.2 自定義著色器的關鍵字 231
29.4 使用multi_compile編譯著色器的
多個版本 232
29.4.1 使用multi_compile實現多次
編譯 232
29.4.2 在腳本中選擇著色器的
版本 232
29.4.3 使用自定義的材質編輯器 233
29.4.4 MaterialEditor 233
29.5 Unity對DX11支持所帶來的
問題 234
第30章 基本的渲染概念 236
30.1 逐頂點計算和逐像素計算 236
30.1.1 逐頂點計算 236
30.1.2 逐像素計算 236
30.1.3 如何在這兩個概念中
取捨 236
30.2 繪製調用的意義 236
30.2.1 繪製調用的概念 236
30.2.2 正確理解繪製調用對開發
套用的意義 236
30.2.3 合批的概念和Unity為最佳化
繪製調用所做的工作 237
30.2.4 最佳化繪製調用 237
30.3 利用渲染佇列的技巧 237
30.3.1 渲染佇列的概念 237
30.3.2 設定渲染佇列的技巧 237
第31章 渲染最佳化 238
31.1 渲染最佳化的元素 238
31.2 小型物體的最佳化 238
31.3 中型物體的最佳化 240
31.4 大型物體的最佳化 241
31.5 模型的最佳化 242
31.6 地形的最佳化 243
31.7 UI的最佳化 246
31.8 物理引擎 248
31.9 慎用後期效果 248
31.10 慎用透明效果 248
31.11 其他 248
31.12 移動平台的特點 249
31.12.1 一些指令的運算速度 249
31.12.2 幾何複雜度 249
31.12.3 貼圖的問題 249
31.12.4 數據類型的使用方式 250
31.12.5 變數的使用 251
附錄 相關資源 252

熱門詞條

聯絡我們