1. 程式人生 > >Unity 自學與進階必會目錄

Unity 自學與進階必會目錄

  • 第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