Unity 3D實戰核心技術詳解
Unity 3D腳本編程:使用C#語言開發跨平颱遊戲
Unity Shader入門精要 Unity 3D網絡遊戲實戰
手把手教你架構3D遊戲引擎
GPU編程與優化 大眾高性能計算
YL0736 9787302446422 9787121303180
9787111549963 9787115423054 9787121297182 9787121304323
內容簡介
《Unity 3D 實戰核心技術詳解》詳細介紹瞭實際遊戲開發中使用的核心技術,每一章都結閤瞭遊戲開發的實戰案例。首先,介紹瞭3D 數學在Unity 中的運用,3D 數學知識包括:Unity 坐標係統、嚮量、矩陣、四元數、歐拉角等基礎知識。其次,介紹瞭遊戲開發中常用的核心技術:Avatar 換裝係統、消息事件係統、Protobuf 在遊戲中的運用,以及遊戲中的文本文件加密算法等。再次,介紹瞭遊戲中的AI 行為樹算法、殘影算法、移動端實時陰影繪製、移動端海水的繪製等技術。然後,在遊戲架構設計方麵,介紹瞭**的針對UI 的MVC 架構設計和對於角色動作和技能的FSM 有限狀態機架構,以及遊戲版本迭代使用的熱更新技術方案。介紹瞭移動端GPU 編程和遊戲開發的一些經驗。
《Unity 3D 實戰核心技術詳解》適閤具備一定Unity 開發經驗的初學者和有一定Unity 項目開發經驗的遊戲開發者閱讀。
作者簡介
薑雪偉,
創業公司技術閤夥人,從事IT行業15年,主導或參與瞭18款大型遊戲的研發;
曾在網龍、久遊、趣遊等知名IT公司擔任核心技術團隊負責人;
在泰課和CSDN學院等在綫教育網擔任高級講師,CSDN社區專傢;
研究方嚮為客戶端架構、3D引擎架構、圖形學算法、GPU編程等,目前負責公司3D引擎的研發工作;
工作之餘,喜歡用書籍記錄自己多年的技術積澱。
目錄
推薦序
推薦語
前言
第1章 3D數學與UNITY
1.1 Unity坐標係
1.2 嚮量
1.2.1 嚮量的加法
1.2.2 嚮量的減法
1.2.3 嚮量點乘
1.2.4 嚮量叉乘
1.3 矩陣
1.3.1 平移矩陣
1.3.2 矩陣縮放
1.3.3 矩陣鏇轉
1.4 四元數
1.5 歐拉角
1.6 小結
第2章 AVATAR換裝係統
2.1 換裝原理
2.2 換裝代碼實現
2.3 小結
第3章 消息事件封裝
3.1 消息類型定義和封裝
3.2 消息事件的監聽與分發
3.3 小結
第4章 PROTOBUF在遊戲中運用
4.1 Protobuf消息結構體定義
4.2 編寫Protobuf結構體
4.3 Protobuf轉換工具製作
4.4 Protobuf文件在Unity中的運用
4.5 小結
第5章 遊戲中的文本文件加密
5.1 配置文件格式
5.2 文件加載接口
5.3 文本文件加密算法及應用
5.4 小結
第6章 行為樹在遊戲中的運用
6.1 行為樹插件介紹
6.2 案例講解
6.3 小結
第7章 殘影
7.1 殘影的技術實現
7.2 Demo展示
7.3 小結
第8章 移動端實時陰影繪製
8.1 移動端實時陰影實現原理
8.2 技術實現
8.3 透明材質實時陰影處理
8.4 小結
第9章 移動端海水仿真技術
9.1 海水實現的技術原理
9.2 海水網格
9.3 海水算法
9.4 海水的技術實現
9.5 海水浮力的實現
9.6 海麵風力實現
9.7 操作界麵
9.8 海水的渲染
9.9 海水案例分享
9.10 小結
第10章 MVC架構設計
10.1 MVC代碼模塊設計
10.2 事件代碼實現案例
10.3 窗體基類的實現案例
10.4 窗體子類代碼實現案例
10.5 控製類實現案例
10.6 狀態類設計實現
10.7 窗體管理類實現案例
10.8 MVC案例分享
10.9 小結
第11章 FSM有限狀態機在遊戲中的運用
11.1 FSM基類設計
11.2 子類設計
11.3 實體類設計
11.4 技能子類
11.5 遊戲案例分享
11.6 小結
第12章 移動端熱更新技術實現
12.1 熱更新架構設計
12.2 資源打包工具的開發
12.3 C#與Lua接口相互結閤
12.4 模塊化接口實現
12.5 Lua腳本邏輯編寫
12.6 案例實現
12.7 小結
第13章 移動端SHADER技術
13.1 可編程流水綫
13.2 頂點著色器
13.3 片段著色器
13.4 Shader案例分享
13.5 小結
第14章 遊戲開發經驗分享
14.1 關於調試經驗分享
14.2 移動端遊戲防破解技術
14.3 減小包體的大小
14.4 動態對象資源的優化
14.5 多綫程資源下載技術
14.6 小結
內容簡介
本書以Unity 3D的跨平颱基礎Mono以及其遊戲腳本語言C#為基礎進行講解。全麵係統地剖析瞭Unity 3D的跨平颱原理以及遊戲腳本開發的特點。第1章主要介紹瞭Unity 3D引擎的曆史以及編輯器的基本知識;第2章主要介紹瞭Mono,以及Unity 3D利用Mono實現跨平颱的原理,並且分析瞭C#語言為何更加適閤Unity 3D遊戲開發;第3章到第10章主要介紹瞭Unity 3D遊戲腳本語言C#在使用Unity 3D開發過程中的知識點,包括Unity 3D腳本的類型基礎、數據結構、在Unity 3D腳本中使用泛型、使用委托和事件打造自己的消息係統、利用定製特性來拓展Unity 3D的編輯器、Unity 3D協程背後的秘密――迭代器以及可空類型和序列化在Unity 3D中使用的相關知識;第11章到第14章,則主要介紹瞭Unity 3D的資源管理以及優化和編譯的內容。
作者簡介
陳嘉棟,畢業於大連海事大學,目前任光宇在綫客戶端高級開發工程師。博客園推薦博客作者,微軟2015年度Visual Studio and Development Technologies有價值專傢(Most Valuable Professional)。認為編程首先是愛好,其次纔是職業。專注前沿技術,熱愛開源。深信代碼改變世界。
沒有值得吹噓的項目,隻有不斷前行的動力。
目錄
第1 章 Hello Unity 3D 1
1.1 Unity 3D 遊戲引擎進化史 1
1.2 Unity 3D 編輯器初印象 5
1.2.1 Project 視圖 5
1.2.2 Inspector 視圖8
1.2.3 Hierarchy 視圖 9
1.2.4 Game 視圖 10
1.2.5 Scene 視圖12
1.2.6 繪圖模式 14
1.2.7 渲染模式16
1.2.8 場景視圖控製 17
1.2.9 Effects 菜單和Gizmos 菜單18
1.3 Unity 3D 的組成 18
1.4 為何需要遊戲腳本 20
1.5 本章總結 21
第2 章 Mono 所搭建的腳本核心基礎22
2.1 Mono 是什麼22
2.1.1 Mono 的組成22
2.1.2 Mono 運行時 23
2.2 Mono 如何扮演腳本的角色24
2.2.1 Mono 和腳本 24
2.2.2 Mono 運行時的嵌入26
2.3 Unity 3D 為何能跨平颱?聊聊CIL38
2.3.1 Unity 3D 為何能跨平颱 38
2.3.2 CIL 是什麼 40
2.3.3 Unity 3D 如何使用CIL 跨平颱 44
2.4 腳本的選擇,C# 或 48
2.4.1 熟悉的陌生人——UnityScript48
2.4.2 UnityScript 與 51
2.4.3 C#與UnityScript 55
2.5 本章總結57
第3 章 Unity 3D 腳本語言的類型係統58
3.1 C#的類型係統 58
3.2 值類型和引用類型 65
3.3 Unity 3D 腳本語言中的引用類型73
3.4 Unity 3D 遊戲腳本中的值類型90
3.4.1 Vector2、Vector3 以及Vector4 90
3.4.2 其他常見的值類型94
3.5 裝箱和拆箱95
3.6 本章總結98
第4 章 Unity 3D 中常用的數據結構99
4.1 Array 數組100
4.2 ArrayList 數組101
4.3 List<T>數組102
4.4 C#中的鏈錶——LinkedList<T>103
4.5 隊列(Queue<T>)和棧(Stack<T>)107
4.6 Hash Table(哈希錶)和Dictionary<K,T>(字典)112
4.7 本章總結120
第5 章 在Unity 3D 中使用泛型121
5.1 為什麼需要泛型機製121
5.2 Unity 3D 中常見的泛型 124
5.3 泛型機製的基礎127
5.3.1 泛型類型和類型參數 128
5.3.2 泛型類型和繼承131
5.3.3 泛型接口和泛型委托 131
5.3.4 泛型方法136
5.4 泛型中的類型約束和類型推斷139
5.4.1 泛型中的類型約束139
5.4.2 類型推斷144
5.5 本章總結146
第6 章 在Unity 3D 中使用委托149
6.1 嚮Unity 3D 中的SendMessage 和BroadcastMessage 說拜拜150
6.2 認識迴調函數機製——委托151
6.3 委托是如何實現的154
6.4 委托是如何調用多個方法的 160
6.5 用事件(Event)實現消息係統164
6.6 事件是如何工作的 169
6.7 定義事件的觀察者,實現觀察者模式 172
6.8 委托的簡化語法 177
6.8.1 不必構造委托對象177
6.8.2 匿名方法 178
6.8.3 Lambda 錶達式 196
6.9 本章總結 201
第7 章 Unity 3D 中的定製特性 202
7.1 初識特性——Attribute 202
7.1.1 DllImport 特性203
7.1.2 Serializable 特性 205
7.1.3 定製特性到底是誰 207
7.2 Unity 3D 中提供的常用定製特性208
7.3 定義自己的定製特性類 213
7.4 檢測定製特性 216
7.5 親手拓展Unity 3D 的編輯器 217
7.6 本章總結227
第8 章 Unity 3D 協程背後的迭代器 228
8.1 初識Unity 3D 中的協程 228
8.1.1 使用StartCoroutine 方法開啓協程 229
8.1.2 使用StopCoroutine 方法停止一個協程 233
8.2 使用協程實現延時效果234
8.3 Unity 3D 協程背後的秘密——迭代器 238
8.3.1 你好,迭代器 238
8.3.2 原來是狀態機 242
8.3.3. 狀態管理 248
8.4 WWW和協程 253
8.5 Unity 3D 協程代碼實例 257
8.6 本章總結259
第9 章 在Unity 3D 中使用可空型 260
9.1 如果沒有值260
9.2 錶示空值的一些方案 261
9.2.1 使用魔值 261
9.2.2 使用標誌位 261
9.2.3 藉助引用類型來錶示值類型的空值 265
9.3 使用可空值類型 267
9.4 可空值類型的簡化語法 272
9.5 可空值類型的裝箱和拆箱 278
9.6 本章總結 280
第10 章 從序列化和反序列化看Unity 3D 的存儲機製 281
10.1 初識序列化和反序列化 281
10.2 控製類型的序列化和反序列化 290
10.2.1 如何使類型可以序列化 290
10.2.2 如何選擇序列化的字段和控製反序列化的流程 292
10.2.3 序列化、反序列化中流的上下文介紹及應用 296
10.3 Unity 3D 中的序列化和反序列化 299
10.3.1 Unity 3D 的序列化概覽 299
10.3.2 對Unity 3D 遊戲腳本進行序列化的注意事項302
10.3.3 如何利用Unity 3D 提供的序列化器對自定義類型進行序列化 305
10.4 Prefab 和實例化之謎——序列化和反序列化的過程309
10.4.1 認識預製體Prefab 309
10.4.2 實例化一個遊戲對象311
10.4.3 序列化和反序列化之謎314
10.5 本章總結317
第11 章 移動平颱動態讀取外部文件 318
11.1 假如我想在編輯器裏動態讀取文件318
11.2 移動平颱的資源路徑問題 320
11.3 移動平颱讀取外部文件的方法323
11.4 使用Resources 類加載資源330
11.5 使用WWW類加載資源332
11.5.1 利用WWW類的構造函數實現資源下載332
11.5.2 利用 WWW.LoadFromCacheOrDownload 方法實現資源下載333
11.5.3 利用WWWForm 類實現POST 請求335
11.6 本章總結335
第12 章 在Unity 3D 中使用AssetBundle 336
12.1 初識AssetBundle 336
12.2 使用AssetBundle 的工作流程337
12.2.1 開發階段 337
12.2.2 運行階段340
12.3 如何使用本地磁盤中的AssetBundle 文件344
12.4 AssetBundle 文件的平颱兼容性345
12.5 AssetBundle 如何識彆資源345
12.6 本章總結346
第13 章 Unity 3D 優化347
13.1 看看Unity 3D 優化需要從哪裏著手 347
13.2 CPU 方麵的優化348
13.2.1 對DrawCall 的優化 348
13.2.2 對物理組件的優化 354
13.2.3 處理內存,卻讓CPU 受傷的GC355
13.2.4 對代碼質量的優化356
13.3 對GPU 的優化 357
13.3.1 減少繪製的數目358
13.3.2 優化顯存帶寬358
13.4 內存的優化 359
13.4.1 Unity 3D 的內部內存 359
13.4.2 Mono 的托管內存 360
13.5 本章總結 363
第14 章 Unity 3D 的腳本編譯 365
14.1 Unity 3D 腳本編譯流程概覽365
14.2 JIT 即時編譯368
14.2.1 使用編譯器將遊戲腳本編譯為托管模塊368
內容簡介
內 容 提 要
本書不僅要教會讀者如何使用Unity Shader,更重要的是要幫助讀者學習Unity中的一些渲染機製以及如何使用Unity Shader實現各種自定義的渲染效果,希望這本書可以為讀者打開一扇新的大門,讓讀者離製作心目中傑齣遊戲的心願更近一步。
本書的主要內容為:第1章講解瞭學習Unity Shader應該從哪裏著手;第2章講解瞭現代GPU是如何實現整個渲染流水綫的,這對理解Shader的工作原理有著非常重要的作用;第3章講解Unity Shader的實現原理和基本語法;第4章學習Shader所需的數學知識,幫助讀者剋服學習Unity Shader時遇到的數學障礙;第5章通過實現一個簡單的頂點/片元著色器案例,講解常用的輔助技巧等;第6章學習如何在Shader中實現基本的光照模型;第7章講述瞭如何在Unity Shader中使用法綫紋理、遮罩紋理等基礎紋理;第8章學習如何實現透明度測試和透明度混閤等透明效果;第9章講解復雜的光照實現;第10章講解在Unity Shader中使用立方體紋理、渲染紋理和程序紋理等高級紋理;第11章學習用Shader實現紋理動畫、頂點動畫等動態效果;第12章講解瞭屏幕後處理效果的屏幕特效;第13章使用深度紋理和法綫紋理實現更多屏幕特效;第14章講解非真實感渲染的算法,如卡通渲染、素描風格的渲染等;第15章講解噪聲在遊戲渲染中的應用;第16章介紹瞭常見的優化技巧;第17章介紹用錶麵著色器實現渲染;第18章講解基於物理渲染的技術;第19章講解在升級Unity 5時可能齣現的問題,並給齣解決方法;第20章介紹許多非常有價值的學習資料,以幫助讀者進行更深入的學習。
本書適閤Unity初學者、遊戲開發者、程序員,也可以作為大專院校相關專業師生的學習用書,以及培訓學校的培訓教材。
作者簡介
馮樂樂,一隻喜歡計算機圖形的程序媛。上海交通大學軟件學院研究生,愛好寫shader,喜歡一切用計算機繪畫的技術。
目錄
第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
內容簡介
本書在一開始便提齣一個明確的學習目標,便是要製作一款完整的多人對戰遊戲,然後一步一步去實現它。全書分為3個部分:
,部分“單機遊戲”:第1章至第5章,主要在於開發一款功能完整坦剋單機遊戲。除瞭讓坦剋行走、開炮,還將介紹基於代碼和資源分離的界麵係統、敵人AI。瞭解開發單機遊戲的知識,也是為接下來的網絡開發學習奠定基礎。
第二部分“網絡原理”:第6章至第8章,主要介紹網絡通信的原理,開發客戶端的網絡模塊和服務端程序框架。這套框架具有較高的通用性,可以運用在多種遊戲上。
第三部分“網絡遊戲”:第9章至第12章,主要講解房間係統和同步係統的邏輯實現,將單機坦剋遊戲改造成多人對戰網絡遊戲。
目錄
第1章 掌握Unity3D基本元素
1.1 簡單的遊戲
1.1.1在場景中創建一個立方體
1.1.2編寫可以使立方體運動的程序
1.1.3測試遊戲
1.1.4總結
1.2 資源導入
1.3 山體係統
1.4 燈光
1.5 材質
1.6 預設
1.6.1製作預設
1.6.2例子
1.7 聲音
1.7.1音源
1.7.2接收器
1.7.3簡單播放器
1.8 GUI
1.8.1用Unity3D編寫HelloWorld程序
1.8.2用Unity3D編寫登錄框
1.9導齣遊戲
第 2 章 駕駛夢想中的坦剋
備用章節名:坦剋控製單元
2.1行走控製
2.1.1Unity3D的腳本
2.1.2獲取輸入操作
2.1.3坐標變換
2.2 相機跟隨
2.2.1跟隨的數學原理
2.2.2相機跟隨的功能實現
2.2.3鼠標控製相機的角度
2.2.4滾輪調整相機與坦剋的距離
2.3 坦剋的物理特徵
2.3.1 Unity3D的物理引擎
2.3.2 車輪碰撞器
2.4 駕駛坦剋
2.5轉動的輪子
2.6滾動的履帶
第3章 開炮擊毀敵人
備用章節名:火炮係統
3.1 鏇轉的炮塔
3.2 俯仰的炮管
3.3 開炮!
3.3.1製作炮彈
3.3.2製作爆炸效果
3.3.3炮彈邏輯
3.3.4開火
3.4 坦剋的控製類型
3.5 摧毀敵軍
3.6 準心
3.7 生命指示條
3.8 擊中提示
3.8.1誰發射瞭炮彈
3.8.2被誰擊中
3.8.3擊殺提示
3.9 炮彈的音效
3.9.1射擊音效
3.9.2爆炸聲音
第4章 進擊的人工智能
備用章節名:人工智能
4.1 實現人工智能的一般方法
4.1.1有限狀態機
4.1.2分層有限狀態機
4.2 搜尋目標
4.2.1編寫AI類
4.2.2在Tank中調用AI類
4.3 嚮敵人開炮
4.3.1鏇轉的炮塔
4.3.2俯仰的炮管
4.3.3開炮!
4.4 路點和路徑
4.4.1路點
4.4.2路徑
4.4.3一種生成路徑的方法
4.4.4給坦剋指定路徑
4.5 走嚮目的地
4.6 使用NavMesh計算路徑
4.6.1NavMesh的原理
4.6.2生成導航圖
4.6.3生成路徑
4.7 行為決策
4.8 戰場
4.8.1戰場邏輯
4.8.2兩軍對峙
第5章 代碼分離的界麵係統
5.1 瞭解Unity UI係統(UGUI)
5.1.1 Canvas畫布
5.1.2 EventSystem
5.1.3 RectTransform
5.1.4 其他UGUI組件
5.1.5 事件觸發
5.2 製作坦剋遊戲界麵
5.3 界麵基類PanelBase
5.3.1 代碼與資源分離的優勢
5.3.2 界麵係統的設計
5.3.3 PanelBase的設計
5.4 界麵管理器PanelMgr
5.4.1 層級管理
5.4.2 打開麵闆OpenPanel
5.4.3 關閉麵闆ClosePanel
5.5 TitlePanel和InfoPanel
5.6 調用界麵係統
5.7 勝負麵闆
5.8 設置麵闆
第6章 網絡基礎
6.1 七層網絡模型
6.1.1 應用層
6.1.2傳輸層
6.1.3網絡層
6.1.4數據鏈路層
6.2 IP與端口
6.3 TCP協議
6.3.1 TCP連接的建立
6.3.2 TCP的數據傳輸
6.3.3 TCP連接的終止
6.4 Socket套接字
6.5 同步Socket程序
6.5.1 新建控製颱程序
6.5.2編寫服務端代碼
6.5.3編寫客戶端程序
6.6 異步socket程序
6.6.1 連接類(state)
6.6.2 異步服務端
6.6.3 開啓服務端
6.6.4 編寫客戶端程序
6.7 Mysql
6.7.1 Mysql基礎入門
6.7.2 留言闆服務端程序
6.7.3 調試程序
6.8 類的序列化
6.9 定時器
6.10 綫程互斥
6.11 通訊協議和消息列錶
6.11.1 通訊協議
6.11.2 服務端程序
6.11.3 客戶端場景
6.11.4 消息列錶
6.11.5 客戶端程序
6.11.6 調試
第7章 遊戲服務端框架
7.1服務端架構
7.1.1 總體架構
7.1.2遊戲流程
7.1.3連接數據結構
7.1.4數據庫結構
7.1.5項目結構
7.2 數據管理類DataMgr
7.2.1 數據庫結構
7.2.2 玩傢數據
7.2.3 Player的初步版本
7.2.4 連接數據庫
7.2.5 防止sql注入
7.2.6 Register注冊
7.2.7 CreatePlayer創建角色
7.2.8 登錄校驗
7.2.9 獲取角色數據
7.2.10 保存角色數據
7.2.11 調試
7.3 處理粘包分包
內容簡介
本書主要介紹如何利用3D固定流水綫編寫遊戲引擎,以及在已編寫引擎的基礎上開發遊戲,全書共分10章,主要內容包括遊戲引擎簡介、數學知識、材質和光照、固定流水綫、遊戲引擎架構、3D引擎底層封裝、3D引擎封裝、遊戲設計實現、地圖編輯器、3D可編程流水綫。本書重點介紹3D固定流水綫編程中涉及的矩陣和嚮量之間的換算,後一章介紹瞭GPU編程,也就是常說的3D可編程流水綫。
作者簡介
碩士研究生,從事互聯網和IT行業十年以上,擅長3D遊戲引擎開發,GPU編程,遊戲架構等技術。曾就職於網龍公司,久遊公司,趣遊等公司並擔任過重要職務,參與或主導過多款商業3D網絡遊戲上綫運營。曾發錶《三維漫遊係統關鍵技術研究》,《虛擬交互漫遊係統關鍵技術研究與實現 》,《移動端海洋實時仿真技術研究與實現》等多篇論文,目前個人擁有兩項軟件著作權。
目錄
第1章 遊戲引擎簡介 (1)
1.1 引擎的原理 (1)
1.2 開發3D引擎具備的條件 (4)
總結 (6)
第2章 數學知識 (8)
2.1 嚮量 (8)
2.1.1 嚮量加法及運用 (9)
2.1.2 嚮量減法及運用 (10)
2.1.3 嚮量點積及應用 (10)
2.1.4 嚮量的叉乘及應用 (12)
2.1.5 嚮量的長度及應用 (13)
2.1.6 嚮量的歸一化及應用 (14)
2.2 矩陣運算 (14)
2.2.1 矩陣加法和減法 (14)
2.2.2 矩陣乘法及運用 (15)
2.3 3D坐標係 (19)
2.4 齊次坐標 (19)
2.5 四元數 (20)
總結 (20)
第3章 材質和光照 (22)
3.1 材質 (22)
3.2 光照 (23)
總結 (26)
第4章 固定流水綫 (27)
4.1 局部坐標到世界坐標的變換 (27)
4.2 世界坐標到相機坐標的變換 (29)
4.3 物體剔除 (31)
4.4 相機坐標到透視坐標的變換 (32)
4.5 透視坐標到視口坐標的變換 (33)
4.6 光柵化 (33)
總結 (34)
第5章 遊戲引擎架構 (35)
5.1 模塊功能細分 (36)
5.2 GDI含義 (36)
5.3 整個引擎渲染思路 (37)
總結 (38)
第6章 3D引擎底層封裝 (39)
6.1 自定義結構體 (39)
6.2 矩陣定義 (45)
6.3 通用類定義 (54)
6.4 嚮量運算 (59)
6.5 燈光 (72)
6.6 視景體 (77)
6.7 矩陣轉換 (83)
6.8 圖形渲染係統 (89)
6.9 材質 (100)
6.10 坐標係之間的轉換 (109)
總結 (158)
第7章 3D引擎封裝 (159)
7.1 相機的實現 (160)
7.2 監聽事件 (166)
7.3 模型分析 (168)
7.4 模型加載 (169)
7.5 模型操作 (180)
7.6 場景管理 (191)
7.7 繪圖接口 (206)
7.8 遊戲窗口 (207)
總結 (217)
第8章 遊戲設計實現 (218)
8.1 遊戲架構 (218)
8.2 坦剋設計 (219)
8.3 AI坦剋 (230)
8.4 子彈設計 (235)
8.5 玩傢控製 (240)
8.6 遊戲類封裝 (246)
8.7 遊戲管理 (253)
8.8 主循環 (276)
總結 (278)
第9章 地圖編輯器 (280)
9.1 編輯器實現 (281)
9.2 模型插件實現 (282)
總結 (284)
第10章 3D可編程流水綫 (285)
10.1 GPU編程語言 (287)
10.2 燈光的Shader渲染 (287)
10.3 CelShading渲染 (291)
10.4 環境映射 (298)
10.5 Phong著色 (302)
10.6 Bloom渲染 (305)
10.7 PSSM陰影 (314)
總結 (323)
內容簡介
本書,篇係統地介紹GPU編程的相關知識,幫助讀者快速入門,並構建GPU知識體係;第二篇和第三篇給齣大量實例,對每個實例進行循序漸進的並行和優化實踐,為讀者提供GPU編程和優化參考;第四篇總結影響GPU性能的關鍵要素(執行核心和存儲體係),量化測評GPU的核心性能參數,給齣CPU/GPU異構係統上覆蓋完全的各種混閤並行模式及其實踐,幫助讀者真正透徹理解GPU。
本書適閤作為計算機及相關專業的教材,也可作為GPU程序開發人員和科研人員的參考書。本書封麵貼有清華大學齣版社防僞標簽,無標簽者不得銷售。
目錄
,篇理論篇
第1章高性能計算概述3
1.1高性能計算概念辨析3
1.1.1並行計算、高性能計算和超級計算3
1.1.2超級計算機與超級計算中心4
1.2計算科學5
1.3高性能計算發展史5
1.4高性能計算簡介6
1.5嚮量機與陣列機8
1.6本章小結9
第2章GPU概述10
2.1GPU是什麼10
2.2協處理器10
2.3GPU與顯卡的關係11
2.4GPU/顯卡購買注意事項11
2.5為什麼要學GPU編程12
2.6GPU與CPU辨析13
2.7GPU發展簡史14
2.8GPU編程方法14
2.9CPU/GPU異構係統16
第3章GPU硬件架構17
3.1GPU架構17
3.1.1Tesla架構18
3.1.2Fermi架構20
3.1.3Kepler架構21
3.1.4Maxwell架構23
3.1.5Pascal架構243.2Kernel的硬件映射28
3.3GPU存儲體係29
3.4GPU計算能力30
GPU編程與優化——大眾高性能計算目錄第4章GPU軟件體係33
4.1GPU軟件生態係統33
4.2CUDA Toolkit34
4.2.1NVCC編譯器34
4.2.2cuobjdump35
4.3CUDA環境安裝36
4.3.1Windows 7安裝CUDA 4.236
4.3.2Linux下安裝CUDA38
第5章CUDA C編程41
5.1CUDA編程模型41
5.2CUDA編程七步麯42
5.3驅動API與運行時API42
5.4CUDA運行時函數43
5.4.1設備管理函數43
5.4.2存儲管理函數45
5.4.3數據傳輸函數48
5.4.4綫程管理函數51
5.4.5流管理函數52
5.4.6事件管理函數52
5.4.7紋理管理函數53
5.4.8執行控製函數55
5.4.9錯誤處理函數55
5.4.10圖形學互操作函數57
5.4.11OpenGL互操作函數58
5.4.12Direct3D互操作函數59
5.5CUDA C語言擴展60
5.6grid�瞓lock�瞭hread三維模型61
第二篇入門篇
第6章嚮量加法67
6.1嚮量加法及其串行代碼67
6.2單block單thread嚮量加68
6.3單block多thread嚮量加68
6.4多block多thread嚮量加69
6.5CUBLAS庫嚮量加法70
6.6實驗結果分析與結論71
6.6.1本書實驗平颱71
6.6.2實驗結果71
6.6.3結論71
6.7知識點總結72
6.8擴展練習75
第7章歸約: 嚮量內積76
7.1嚮量內積及其串行代碼76
7.2單block分散歸約嚮量內積77
7.3單block低綫程歸約嚮量內積78
7.4多block嚮量內積(CPU二次歸約)79
7.5多block嚮量內積(GPU二次歸約)81
7.6基於原子操作的多block嚮量內積81
7.7計數法實現多block嚮量內積84
7.8CUBLAS庫嚮量內積85
7.9實驗結果與結論86
7.9.1實驗結果86
7.9.2結論86
7.10歸約的深入優化探討87
7.10.1block數量和thread數量對歸約性能的影響87
7.10.2算術運算優化88
7.10.3減少同步開銷89
7.10.4循環展開90
7.10.5總結91
7.11知識點總結91
7.12擴展練習94
第8章矩陣乘法95
8.1矩陣乘法及其3種串行代碼95
8.1.1一般矩陣乘法95
8.1.2循環交換矩陣乘法97
8.1.3轉置矩陣乘法98
8.1.4實驗結果與優串行矩陣乘99
8.2grid綫程循環矩陣乘法100
8.3block綫程循環矩陣乘法101
8.4行共享存儲矩陣乘法101
8.5棋盤陣列矩陣乘法103
8.6判斷移除105
8.7CUBLAS矩陣乘法106
8.8實驗結果分析與結論108
8.8.1矩陣乘精度分析108
8.8.2實驗結果分析110
8.8.3浮點運算能力分析111
8.9行共享存儲矩陣乘法改進111
8.10知識點總結113
8.11擴展練習115
第9章矩陣轉置116
9.1矩陣轉置及其串行代碼116
9.21D矩陣轉置117
9.32D矩陣轉置118
9.4共享存儲2D矩陣轉置119
9.5共享存儲2D矩陣轉置diagonal優化120
9.6實驗結果分析與結論121
9.7共享存儲2D矩陣轉置的深入優化122
9.8知識點總結124
9.9擴展練習125
第三篇提高篇
第10章捲積129
10.1捲積及其串行實現129
10.1.1一維捲積129
10.1.2二維捲積131
10.2GPU上1D捲積134
10.3M常量1D捲積135
10.4M共享1D捲積136
10.5N共享1D捲積137
10.6實驗結果分析139
10.6.1擴展法1D捲積實驗結果分析139
10.6.2判斷法與擴展法1D捲積對比140
10.6.3加速比分析141
10.6.4綫程維度對性能的影響141
10.72D捲積的GPU移植與優化142
10.7.1GPU上2D捲積142
10.7.2M常量2D捲積143
10.7.3M常量N共享2D捲積143
10.7.42D捲積實驗結果分析145
10.8知識點總結145
10.9擴展練習147
第11章曼德博羅特集148
11.1曼德博羅特集及其串行實現148
11.2曼德博羅特集的GPU映射150
11.3一些優化嘗試及效果152
11.3.1訪存連續152
11.3.2uchar4訪存閤並153
11.3.34種零拷貝153
11.3.4總結分析155
11.4計算通信重疊優化156
11.5突破kernel執行時間限製159
11.6知識點總結160
11.7擴展練習162
第12章掃描: 前綴求和163
12.1前綴求和及其串行代碼163
12.2Kogge�睸tone並行前綴和164
12.2.1直接Kogge�睸tone分段前綴和164
12.2.2交錯Kogge�睸tone分段前綴和165
12.2.3完整Kogge�睸tone前綴和166
12.3Brent�睰ung並行前綴和168
12.3.1Brent�睰ung分段前綴和169
12.3.2兩倍數據的Brent�睰ung分段前綴和170
12.3.3避免bank conflict的兩倍數據Brent�睰ung分段前綴和171
12.3.4完整Brent�睰ung前綴和173
12.4warp分段的Kogge�睸tone前綴求和174
12.5實驗結果分析與結論177
12.6知識點總結179
12.7擴展練習180第13章排序181
13.1串行排序及其性能181
13.1.1選擇排序181
13.1.2冒泡排序182
13.1.3快速排序182
13.1.4基數排序183
13.1.5雙調排序網絡185
13.1.6閤並排序186
13.1.7串行排序性能對比187
13.2基數排序188
13.2.1基數排序概述188
13.2.2單block基數排序189
13.2.3基於thrust庫的基數排序196
13.3雙調排序網絡197
13.3.1雙調排序網絡概述197
13.3.2單block雙調排序網絡199
13.3.3多block雙調排序網絡202
13.4快速排序206
13.5閤並排序207
13.6實驗結果分析與結論208
13.7知識點總結209
13.8擴展練習210
第14章幾種簡單圖像處理211
14.1圖像直方圖統計211
14.1.1串行直方圖統計211
14.1.2並行直方圖統計211
14.1.3實驗結果與分析212
14.2中值濾波213
14.2.1串行中值濾波214
14.2.21D並行中值濾波215