# Unity 自學與進階必會目錄
阿新 • • 發佈:2019-02-07
- 第1篇 基礎篇
-
- 第1章 歡迎來到Shader的世界 2
- 1.1 程式設計師的三大浪漫 2
- 1.2 本書結構 3
-
- 第2章 渲染流水線 5
- 2.1 綜述 5
- 2.1.1 什麼是流水線 5
- 2.1.2 什麼是渲染流水線 6
- 2.2 CPU和GPU之間的通訊 7
- 2.2.1 把資料載入到視訊記憶體中 7
- 2.2.2 設定渲染狀態 8
- 2.2.3 呼叫Draw Call 8
- 2.3 GPU流水線 9
- 2.3.1 概述 9
- 2.3.2 頂點著色器 10
- 2.3.3 裁剪 11
- 2.3.4 螢幕對映 11
- 2.3.5 三角形設定 12
- 2.3.6 三角形遍歷 13
- 2.3.7 片元著色器 13
- 2.3.8 逐片元操作 14
- 2.3.9 總結 17
- 2.4 一些容易困惑的地方 18
- 2.4.1 什麼是OpenGL/DirectX 18
- 2.4.2 什麼是HLSL、GLSL、CG 19
- 2.4.3 什麼是Draw Call 20
- 2.4.4 什麼是固定管線渲染 22
- 2.5 那麼,你明白什麼是Shader了嗎 23
- 2.6 擴充套件閱讀 23
-
- 第3章 Unity Shader基礎 24
- 3.1 Unity Shader概述 25
- 3.1.1 一對好兄弟:材質和Unity Shader 25
- 3.1.2 Unity中的材質 26
- 3.1.3 Unity中的Shader 26
- 3.2 Unity Shader的基礎:ShaderLab 28
- 3.3 Unity Shader的結構 29
- 3.3.1 給我們的Shader起個名字 29
- 3.3.2 材質和Unity Shader的橋樑:Properties 29
- 3.3.3 重量級成員:SubShader 31
- 3.3.4 留一條後路:Fallback 33
- 3.3.5 ShaderLab還有其他的
- 語義嗎 33
- 3.4 Unity Shader的形式 33
- 3.4.1 Unity的寵兒:表面著色器 34
- 3.4.2 最聰明的孩子:頂點/片元著
- 色器 35
- 3.4.3 被拋棄的角落:固定函式著
- 色器 35
- 3.4.4 選擇哪種Unity Shader形式 36
- 3.5 本書使用的Unity Shader形式 36
- 3.6 答疑解惑 36
- 3.6.1 Unity Shader != 真正的Shader 36
- 3.6.2 Unity Shader和CG/HLSL之間的關係 37
- 3.6.3 我可以使用GLSL來寫嗎 38
- 3.7 擴充套件閱讀 38
-
- 第4章 學習Shader所需的數學基礎 39
- 4.1 背景:農場遊戲 39
- 4.2 笛卡兒座標系 40
- 4.2.1 二維笛卡兒座標系 40
- 4.2.2 三維笛卡兒座標系 41
- 4.2.3 左手座標系和右手座標系 42
- 4.2.4 Unity使用的座標系 44
- 4.2.5 練習題 45
- 4.3 點和向量 45
- 4.3.1 點和向量的區別 46
- 4.3.2 向量運算 47
- 4.3.3 練習題 53
- 4.4 矩陣 54
- 4.4.1 矩陣的定義 54
- 4.4.2 和向量聯絡起來 55
- 4.4.3 矩陣運算 55
- 4.4.4 特殊的矩陣 57
- 4.4.5 行矩陣還是列矩陣 60
- 4.4.6 練習題 61
- 4.5 矩陣的幾何意義:變換 62
- 4.5.1 什麼是變換 62
- 4.5.2 齊次座標 63
- 4.5.3 分解基礎變換矩陣 63
- 4.5.4 平移矩陣 64
- 4.5.5 縮放矩陣 64
- 4.5.6 旋轉矩陣 65
- 4.5.7 複合變換 66
- 4.6 座標空間 67
- 4.6.1 為什麼要使用這麼多不同的座標空間 68
- 4.6.2 座標空間的變換 68
- 4.6.3 頂點的座標空間變換過程 72
- 4.6.4 模型空間 73
- 4.6.5 世界空間 73
- 4.6.6 觀察空間 75
- 4.6.7 裁剪空間 77
- 4.6.8 螢幕空間 83
- 4.6.9 總結 85
- 4.7 法線變換 86
- 4.8 Unity Shader的內建變數(數學篇) 87
- 4.8.1 變換矩陣 87
- 4.8.2 攝像機和螢幕引數 88
- 4.9 答疑解惑 89
- 4.9.1 使用3×3還是4×4的
- 變換矩陣 89
- 4.9.2 CG中的向量和矩陣型別 89
- 4.9.3 Unity中的螢幕座標:ComputeScreenPos/VPOS/
- WPOS 90
- 4.10 擴充套件閱讀 93
- 4.11 練習題答案 93
- 第2篇 初級篇
-
- 第5章 開始Unity Shader學習之旅 100
- 5.1 本書使用的軟體和環境 100
- 5.2 一個最簡單的頂點/片元著色器 100
- 5.2.1 頂點/片元著色器的基本
- 結構 101
- 5.2.2 模型資料從哪裡來 103
- 5.2.3 頂點著色器和片元著色器之間如何通訊 104
- 5.2.4 如何使用屬性 105
- 5.3 強大的援手:Unity提供的內建檔案和變數 107
- 5.3.1 內建的包含檔案 107
- 5.3.2 內建的變數 109
- 5.4 Unity提供的CG/HLSL語義 109
- 5.4.1 什麼是語義 109
- 5.4.2 Unity支援的語義 110
- 5.4.3 如何定義複雜的變數型別 110
- 5.5 程式設計師的煩惱:Debug 111
- 5.5.1 使用假彩色影象 111
- 5.5.2 利用神器:Visual Studio 113
- 5.5.3 最新利器:幀偵錯程式 113
- 5.6 小心:渲染平臺的差異 115
- 5.6.1 渲染紋理的座標差異 115
- 5.6.2 Shader的語法差異 116
- 5.6.3 Shader的語義差異 117
- 5.6.4 其他平臺差異 117
- 5.7 Shader整潔之道 117
- 5.7.1 float、half還是fixed 117
- 5.7.2 規範語法 118
- 5.7.3 避免不必要的計算 118
- 5.7.4 慎用分支和迴圈語句 119
- 5.7.5 不要除以0 119
- 5.8 擴充套件閱讀 120
-
- 第6章 Unity中的基礎光照 121
- 6.1 我們是如何看到這個世界的 121
- 6.1.1 光源 121
- 6.1.2 吸收和散射 122
- 6.1.3 著色 122
- 6.1.4 BRDF光照模型 123
- 6.2 標準光照模型 123
- 6.2.1 環境光 123
- 6.2.2 自發光 124
- 6.2.3 漫反射 124
- 6.2.4 高光反射 124
- 6.2.5 逐畫素還是逐頂點 125
- 6.2.6 總結 125
- 6.3 Unity中的環境光和自發光 126
- 6.4 在Unity Shader中實現漫反射光照
- 模型 126
- 6.4.1 實踐:逐頂點光照 126
- 6.4.2 實踐:逐畫素光照 129
- 6.4.3 半蘭伯特模型 130
- 6.5 在Unity Shader中實現高光反射
- 光照模型 131
- 6.5.1 實踐:逐頂點光照 132
- 6.5.2 實踐:逐畫素光照 134
- 6.5.3 Blinn-Phong光照模型 135
- 6.6 召喚神龍:使用Unity內建的
- 函式 136
-
- 第7章 基礎紋理 139
- 7.1 單張紋理 140
- 7.1.1 實踐 140
- 7.1.2 紋理的屬性 142
- 7.2 凹凸對映 146
- 7.2.1 高度紋理 146
- 7.2.2 法線紋理 146
- 7.2.3 實踐 148
- 7.2.4 Unity中的法線紋理型別 154
- 7.3 漸變紋理 155
- 7.4 遮罩紋理 158
- 7.4.1 實踐 159
- 7.4.2 其他遮罩紋理 161
-
- 第8章 透明效果 162
- 8.1 為什麼渲染順序很重要 163
- 8.2 Unity Shader的渲染順序 164
- 8.3 透明度測試 165
- 8.4 透明度混合 169
- 8.5 開啟深度寫入的半透明效果 171
- 8.6 ShaderLab的混合命令 173
- 8.6.1 混合等式和引數 173
- 8.6.2 混合操作 174
- 8.6.3 常見的混合型別 175
- 8.7 雙面渲染的透明效果 176
- 8.7.1 透明度測試的雙面渲染 176
- 8.7.2 透明度混合的雙面渲染 176
- 第3篇 中級篇
-
- 第9章 更復雜的光照 180
- 9.1 Unity的渲染路徑 180
- 9.1.1 前向渲染路徑 182
- 9.1.2 頂點照明渲染路徑 185
- 9.1.3 延遲渲染路徑 186
- 9.1.4 選擇哪種渲染路徑 188
- 9.2 Unity的光源型別 188
- 9.2.1 光源型別有什麼影響 189
- 9.2.2 在前向渲染中處理不同的
- 光源型別 190
- 9.3 Unity的光照衰減 195
- 9.3.1 用於光照衰減的紋理 196
- 9.3.2 使用數學公式計算衰減 196
- 9.4 Unity的陰影 196
- 9.4.1 陰影是如何實現的 197
- 9.4.2 不透明物體的陰影 198
- 9.4.3 使用幀偵錯程式檢視陰影繪製過程 202
- 9.4.4 統一管理光照衰減和陰影 204
- 9.4.5 透明度物體的陰影 206
- 9.5 本書使用的標準Unity Shader 209
-
- 第10章 高階紋理 210
- 10.1 立方體紋理 210
- 10.1.1 天空盒子 210
- 10.1.2 建立用於環境對映的立方體
- 紋理 212
- 10.1.3 反射 213
- 10.1.4 折射 215
- 10.1.5 菲涅耳反射 217
- 10.2 渲染紋理 219
- 10.2.1 鏡子效果 219
- 10.2.2 玻璃效果 220
- 10.2.3 渲染紋理 vs. GrabPass 224
- 10.3 程式紋理 225
- 10.3.1 在Unity中實現簡單的程式
- 紋理 225
- 10.3.2 Unity的程式材質 228
-
- 第11章 讓畫面動起來 230
- 11.1 Unity Shader中的內建變數
- (時間篇) 230
- 11.2 紋理動畫 230
- 11.2.1 序列幀動畫 230
- 11.2.2 滾動的背景 233
- 11.3 頂點動畫 234
- 11.3.1 流動的河流 234
- 11.3.2 廣告牌 236
- 11.3.3 注意事項 239
- 第4篇 高階篇
-
- 第12章 屏幕後處理效果 244
- 12.1 建立一個基本的屏幕後處理指令碼
- 系統 244
- 12.2 調整螢幕的亮度、飽和度和
- 對比度 246
- 12.3 邊緣檢測 249
- 12.3.1 什麼是卷積 249
- 12.3.2 常見的邊緣檢測運算元 249
- 12.3.3 實現 250
- 12.4 高斯模糊 253
- 12.4.1 高斯濾波 253
- 12.4.2 實現 254
- 12.5 Bloom效果 259
- 12.6 運動模糊 263
- 12.7 擴充套件閱讀 266
-
- 第13章 使用深度和法線紋理 267
- 13.1 獲取深度和法線紋理 267
- 13.1.1 背後的原理 267
- 13.1.2 如何獲取 269
- 13.1.3 檢視深度和法線紋理 271
- 13.2 再談運動模糊 272
- 13.3 全域性霧效 276
- 13.3.1 重建世界座標 276
- 13.3.2 霧的計算 278
- 13.3.3 實現 278
- 13.4 再談邊緣檢測 283
- 13.5 擴充套件閱讀 287
-
- 第14章 非真實感渲染 288
- 14.1 卡通風格的渲染 288
- 14.1.1 渲染輪廓線 288
- 14.1.2 新增高光 289
- 14.1.3 實現 290
- 14.2 素描風格的渲染 293
- 14.3 擴充套件閱讀 296
- 14.4 參考文獻 297
-
- 第15章 使用噪聲 298
- 15.1 消融效果 298
- 15.2 水波效果 302
- 15.3 再談全域性霧效 305
- 15.4 擴充套件閱讀 309
- 15.5 參考文獻 309
-
- 第16章 Unity中的渲染優化技術 310
- 16.1 移動平臺的特點 310
- 16.2 影響效能的因素 311
- 16.3 Unity中的渲染分析工具 312
- 16.3.1 認識Unity 5的渲染統計
- 視窗 312
- 16.3.2 效能分析器的渲染區域 313
- 16.3.3 再談幀偵錯程式 313
- 16.3.4 其他效能分析工具 314
- 16.4 減少draw call數目 314
- 16.4.1 動態批處理 315
- 16.4.2 靜態批處理 316
- 16.4.3 共享材質 318
- 16.4.4 批處理的注意事項 318
- 16.5 減少需要處理的頂點數目 319
- 16.5.1 優化幾何體 319
- 16.5.2 模型的LOD技術 319
- 16.5.3 遮擋剔除技術 320
- 16.6 減少需要處理的片元數目 320
- 16.6.1 控制繪製順序 320
- 16.6.2 時刻警惕透明物體 321
- 16.6.3 減少實時光照和陰影 321
- 16.7 節省頻寬 322
- 16.7.1 減少紋理大小 322
- 16.7.2 利用解析度縮放 323
- 16.8 減少計算複雜度 323
- 16.8.1 Shader的LOD技術 323
- 16.8.2 程式碼方面的優化 323
- 16.8.3 根據硬體條件進行縮放 324
- 16.9 擴充套件閱讀 324
- 第5篇 擴充套件篇
-
- 第17章 Unity的表面著色器探祕 328
- 17.1 表面著色器的一個例子 328
- 17.2 編譯指令 330
- 17.2.1 表面函式 330
- 17.2.2 光照函式 330
- 17.2.3 其他可選引數 331
- 17.3 兩個結構體 332
- 17.3.1 資料來源:Input結構體 332
- 17.3.2 表面屬性:SurfaceOutput
- 結構體 333
- 17.4 Unity背後做了什麼 334
- 17.5 表面著色器例項分析 336
- 17.6 Surface Shader的缺點 341
-
- 第18章 基於物理的渲染 342
- 18.1 PBS的理論和數學基礎 342
- 18.1.1 光是什麼 343
- 18.1.2 雙向反射分佈函式
- (BRDF) 344
- 18.1.3 漫反射項 345
- 18.1.4 高光反射項 346
- 18.1.5 Unity中的PBS實現 347
- 18.2 Unity 5的Standard Shader 348
- 18.2.1 它們是如何實現的 348
- 18.2.2 如何使用Standard Shader 349
- 18.3 一個更加複雜的例子 352
- 18.3.1 設定光照環境 352
- 18.3.2 放置反射探針 355
- 18.3.3 調整材質 356
- 18.3.4 線性空間 356
- 18.4 答疑解惑 357
- 18.4.1 什麼是全域性光照 357
- 18.4.2 什麼是伽馬校正 358
- 18.4.3 什麼是HDR 361
- 18.4.4 那麼,PBS適合什麼樣的
- 遊戲 362
- 18.5 擴充套件閱讀 363
- 18.6 參考文獻 363
-
- 第19章 Unity 5更新了什麼 365
- 19.1 場景“更亮了” 365
- 19.2 表面著色器更容易“報錯了” 365
- 19.3 當家做主:自己控制非統一縮放的
- 網格 366
- 19.4 固定管線著色器逐漸退出舞臺 366
-
- 第20章 還有更多內容嗎 368
- 20.1 如果你想深入瞭解渲染的話 368
- 20.2 世界那麼大 369
- 20.3 參考文獻 369