圖書簡介
本書直接從VSL、Shader、SDK的角度來講解Virtools開發遊戲、虛擬漫遊的各方面,所以本書面向的是已經具有一定編程經驗的讀者,最好已經學會了Virtools。
本書的內容是先從容易上手的VSL腳本講起,最先講的是VSL的基礎語法。可以讓沒有代碼開發經驗的讀者也能夠看懂VSL,然後慢慢講解各個VSL類型的用法。
VSL部分講解完後,接著就是Shader的學習和套用。Shader可謂是短小精悍,算法卻博大精深,所以要求讀者了解HLSL語言基礎,這一部分講解了目前遊戲中經常用到的畫面效果,非常值得學習。
SDK是發揮和擴充Virtools功能的利器,SDK涉及的面很廣,所以沒有像VSL部分那樣羅列所有類的用法,而是強調如何進行開發,講解了常用的SDK開發方式。掌握這一部分,就相當於完全駕馭了Virtools引擎。
隨書附送有配套光碟。光碟按章節順序提供了書中所用的實例代碼,這些代碼都經過了作者的精心調試,在Windows XP、Virtools 4.0下保證可用。
圖書目錄
第一部分 VSL腳本語言程式設計
第1章 認識VSL 3
1.1 VSL簡介 3
1.1.1 BB與VSL的關係 3
1.1.2 VSL的優勢 3
1.1.3 VSL腳本語言與C語言的對比 5
1.1.4 VSL與其他腳本語言的差異 5
1.2 VSL腳本管理器 5
1.2.1 VSL腳本管理器的使用 5
1.2.2 創造VSL腳本程式 6
1.2.3 帶輸入輸出的VSL腳本程式 7
1.2.4 VSL腳本程式的重命名、定位和刪除 10
1.2.5 VSL快捷鍵使用 10
1.3 VSL語法描述 11
1.3.1 VSL的變數和常量 11
1.3.2 VSL的運算符 12
1.3.3 VSL的表達式與語句 13
1.3.4 VSL的賦值語句、聲明語句和注釋 15
1.3.5 VSL的條件判斷語句 15
1.3.6 VSL的循環和控制語句 20
1.3.7 數組和多維數組 25
第2章 VSL的函式 28
2.1 函式的定義與調用 28
2.1.1 函式的概念 28
2.1.2 定義函式 29
2.1.3 函式的調用 29
2.1.4 函式的重載 30
2.2 函式的參數及其返回值 31
2.2.1 形參和實參 31
2.2.2 函式值的返回 32
2.3 變數的作用域和存儲類型 33
2.3.1 局部變數、全局變數和作用域 33
2.3.2 VSL全局共享變數和全局靜態變數 35
2.3.3 結構體和枚舉類型 36
2.4 字元串類的使用 39
2.4.1 字元變數、字元串類型變數、字元數組和字元串類的區別 39
2.4.2 字元串類的定義與賦值 39
2.4.3 字元串的處理函式 40
2.4.4 字元串的套用 41
第3章 VSL中的3D數學與變換以及簡單幾何體 43
3.1 向量 43
3.1.1 向量的概念 43
3.1.2 向量長度和歸一化 44
3.1.3 向量的加減 44
3.1.4 向量和標量的乘法 45
3.1.5 向量的點積 45
3.1.6 向量的叉積 45
3.1.7 位置和位移向量 46
3.2 VSL中的2D向量Vector2D 46
3.2.1 Vector2D的方法 46
3.2.2 Vector2D的套用 48
3.3 VSL中的3D向量Vector 50
3.3.1 Vector的方法 50
3.3.2 Vector的套用 50
3.4 矩陣和Matrix 51
3.4.1 矩陣的概念 51
3.4.2 Matrix的方法和套用 52
3.5 簡單幾何體 53
3.5.1 點、線、面 53
3.5.2 正方體 54
3.5.3 圓錐體和圓球 55
3.5.4 矩形 55
第4章 Virtools中的2D實體 60
4.1 2D幀Entity2D 60
4.1.1 Entity2D與Rect 60
4.1.2 Entity2D的套用 60
4.2 2D精靈Sprite 64
4.2.1 Sprite與Entity2D 64
4.2.2 Sprite的套用 65
第5章 燈光、材質和紋理 68
5.1 光 68
5.1.1 光的類型 68
5.1.2 用VSL設定光照 69
5.1.3 光的衰減屬性 69
5.1.4 高光 70
5.1.5 色彩 71
5.2 材質的特性 72
5.2.1 物體表面材質屬性 72
5.2.2 3D物體填充模式 73
5.2.3 Flat渲染和Gouraud渲染 74
5.2.4 Alpha混合 74
5.2.5 Alpha測試 76
5.2.6 紋理採樣過濾 77
5.2.7 紋理定址 78
5.2.8 多重紋理混合 79
5.2.9 紋理過濾和紋理定址的顯示例程 80
5.3 紋理的特性 81
5.3.1 紋理的插槽屬性 81
5.3.2 天空盒紋理 83
第6章 3D物體 85
6.1 3DEntity 85
6.1.1 坐標系和3D物體 85
6.1.2 3DEntity的位置、方向與縮放 86
6.1.3 物體的父子關係 89
6.1.4 物體的格線 91
6.1.5 3D物體的螢幕坐標位置 92
6.2 Mesh 93
6.2.1 Mesh的套用 93
6.2.2 Mesh與材質、紋理貼圖 95
6.2.3 紋理坐標:(u,v)坐標 95
6.2.4 Mesh的通道材質特性 96
6.3 3D精靈Sprite3D 97
6.3.1 3D精靈和公告板 97
6.3.2 3D精靈的套用 97
第7章 角色動畫 99
7.1 角色 99
7.1.1 角色的概念 99
7.1.2 播放角色動畫 99
7.1.3 角色的次級動畫播放 102
7.1.4 角色的身體 104
7.2 角色動畫 105
7.2.1 如何確定角色動畫是否有問題 105
7.2.2 角色的動畫幀 105
7.2.3 角色動畫的一些設定 108
7.2.4 用VSL設定角色動畫 110
7.3 角色動畫的套用 111
第8章 攝像機 116
8.1 相機的基本屬性 116
8.1.1 相機的投影 116
8.1.2 相機的視錐 118
8.1.3 目標相機 119
8.2 相機的套用 119
8.2.1 第一人稱相機 119
8.2.2 第三人稱相機 122
第9章 曲線與格線 126
9.1 3D曲線 126
9.1.1 3D曲線和3D曲線節點的概念 126
9.1.2 3D曲線的套用 128
9.1.3 3D曲線節點的詳細設定 129
9.2 2D路徑 131
9.3 格線 133
9.3.1 格線和層 133
9.3.2 格線的VSL套用 133
第10章 表、組和場景 137
10.1 表 137
10.1.1 表的數據存儲類型 137
10.1.2 使用VSL創建表和存儲數據 138
10.1.3 通過VSL提取表中數據和刪除行列 140
10.1.4 通過VSL對表中數據的操作 142
10.2 組 143
10.2.1 組的意義 143
10.2.2 組的套用 143
10.3 場景 144
10.3.1 場景的概念 144
10.3.2 場景技術的簡單套用 146
10.4 數據容器 147
10.4.1 數據容器的使用 147
10.4.2 String、StringTokenizer和ArrayString 150
第11章 聲音與視頻 152
11.1 聲音的基本運用 152
11.1.1 聲音的特性 152
11.1.2 播放聲音的方法 153
11.1.3 2D聲音和3D聲音 154
11.2 聲音的高級套用 155
11.2.1 錐形的聽覺範圍 155
11.2.2 聲音的多重播放 157
11.3 視頻的播放 158
11.3.1 視頻的屬性 158
11.3.2 視頻的播放 159
第12章 VSL中的bc 161
12.1 工廠的概念 161
12.1.1 工廠的作用 161
12.1.2 工廠的產品 161
12.1.3 工廠如何複製產品 162
12.1.4 工廠如何刪除產品 164
12.2 屬性控制 165
12.2.1 屬性的概念 165
12.2.2 屬性的操作 165
12.3 bc的其他功能 168
12.3.1 取得場景物件 168
12.3.2 bc的其他一些小功能 172
12.4 輸入管理器 174
12.4.1 滑鼠的使用 174
12.4.2 鍵盤的使用 176
12.5 渲染設備 179
12.5.1 渲染設備的概念 179
12.5.2 如何設定霧 179
12.5.3 滑鼠拾取物件 181
12.5.4 2D螢幕與3D位置 185
12.6 ac 188
12.6.1 ac的概念 188
12.6.2 如何創建和使用ac 188
第二部分 高級渲染語言
第13章 Virtools中的Shader 193
13.1 認識Shader 193
13.1.1 Shader的誕生 193
13.1.2 Virtools中的Shader 193
13.1.3 Virtools中Shader的執行過程 194
13.1.4 Shader編輯器 195
13.2 Shader語言 196
13.2.1 創建第一個Shader程式 196
13.2.2 頂點著色器和像素著色器 198
第14章 光照 200
14.1 參數 200
14.1.1 設定自發光參數的Virtools寫法 200
14.1.2 設定自發光參數的HLSL寫法 201
14.2 光照 203
14.2.1 光照的原理 203
14.2.2 光照Shader 204
14.2.3 光照的HLSL寫法 206
14.3 鏡面反射 210
14.3.1 一盞燈的鏡面反射光照 210
14.3.2 兩盞燈的鏡面反射光照 212
第15章 紋理貼圖光照 214
15.1 簡單的紋理渲染 214
15.1.1 Virtools紋理渲染的Shader代碼 214
15.1.2 HLSL紋理渲染 215
15.1.3 帶光照的紋理渲染 216
15.1.4 逐像素地紋理渲染 217
15.1.5 兩層紋理渲染 220
15.2 凹凸紋理映射 221
15.2.1 凹凸紋理映射的由來 221
15.2.2 凹凸紋理映射的原理 222
15.2.3 凹凸紋理映射的實現 222
15.2.4 改良的凹凸紋理映射 226
15.3 環境映射 230
15.3.1 環境映射的原理和立方貼圖紋理 230
15.3.2 Virtools中如何生成立方體貼圖 231
15.3.3 反射環境映射 231
15.3.4 折射環境映射 234
15.3.5 菲涅爾效果和顏色色散 237
15.3.6 環境映射和凹凸紋理映射的結合 241
15.4 2DFrame的Shader 244
15.4.1 2D幀的多次渲染 244
15.4.2 2D幀的旋轉 246
第16章 Shader的效果 250
16.1 Shader實現動畫效果 250
16.1.1 脈動的茶壺——頂點動畫 250
16.1.2 舞動的花朵——紋理UV動畫 252
16.1.3 波光粼粼的淺水區——序列幀動畫 256
16.2 簡單的修飾效果 258
16.2.1 廣告牆變換效果 258
16.2.2 海底焦散 261
16.2.3 畫面模糊效果 265
16.2.4 景深效果 268
16.2.5 地球大氣效果 271
16.3 簡單的幾個其他效果 276
16.3.1 灼燒 276
16.3.2 發光 277
16.3.3 綻放 280
16.3.4 毛髮 284
16.3.5 灰度 288
第17章 Shader的套用 290
17.1 地形渲染 290
17.1.1 TextureSplatting原理簡介 290
17.1.2 TextureSplatting對地形建模的一點要求 291
17.1.3 Shader代碼剖析 291
17.2 運動模糊 296
17.2.1 運動模糊原理簡介 296
17.2.2 設定需要配合的資源 296
17.2.3 運動模糊的Shader代碼 297
17.3 帶倒影的水面渲染 300
17.3.1 渲染水面的步驟 300
17.3.2 水面的設定 302
17.3.3 水的Shader代碼 303
第18章 Shader的其他套用 307
18.1 渲染車 307
18.1.1 渲染車燈 307
18.1.2 渲染車輪 311
18.1.3 渲染車窗 314
18.2 渲染場景 317
18.2.1 帶法線的地形渲染 317
18.2.2 樹的渲染 322
18.2.3 樹葉與草的渲染 323
第三部分 VirtoolsSDK
第19章 認識VirtoolsSDK 329
19.1 Virtools的體系結構 329
19.1.1 SDK的介紹 329
19.1.2 幀循環的介紹 331
19.1.3 主要對象之間的關係 332
19.2 使用SDK創建BB 333
19.2.1 行動前的準備 333
19.2.2 通過嚮導創建BB 335
19.2.3 BB源檔案的解釋 338
19.2.4 編譯生成BB 344
第20章 用SDK開發BB 346
20.1 BB的參數 346
20.1.1 BB的3種參數 346
20.1.2 BB參數值的獲取和賦值 347
20.1.3 改變BB參數的數量和類型 349
20.2 BB的輸入輸出連線埠 354
20.3 自定義類型的參數 358
20.3.1 自定義類型的參數說明 358
20.3.2 創建簡單的自定義參數 359
20.3.3 結構體類型參數的處理函式 361
20.4 使用SDK的BB 367
20.4.1 修改PushBotton和DragAndDrop 367
20.4.2 轉向功能 368
20.4.3 有層級關係的中文顯示 370
第21章 用SDK擴展功能 379
21.1 多執行緒的套用 379
21.1.1 進程和執行緒 379
21.1.2 VxThread、VxMutexl、VxMutexlLock 380
21.1.3 多執行緒的套用 381
21.2 管理器的開發使用 391
21.2.1 管理器 391
21.2.2 Manager代碼解釋 394
21.2.3 Virtools與ADO的整合 395
21.2.4 創建ADOACCESSManager 397
21.2.5 在BB中調用管理器的方法 404
21.2.6 管理器功能的整合 406
21.3 為VSL綁定新類型 408
21.3.1 綁定新類型的規則 408
21.3.2 綁定的細則 409
21.3.3 綁定的簡單範例 414
21.4 第三方聲音引擎與Virtools的整合 415
21.4.1 整合第三方聲音引擎的原因 415
21.4.2 第三方聲音引擎使用介紹 416
21.4.3 不同喇叭播放不同聲音 417
21.5 網路引擎與Virtools的整合 425
21.5.1 整合網路引擎的原因 425
21.5.2 使用網路引擎創建伺服器 425
21.5.3 網路模組管理器 430
21.5.4 連線到伺服器的BB 436
21.5.5 傳送訊息到伺服器的BB 438
21.5.6 處理伺服器訊息的BB 439
第22章 用SDK開發新功能 442
22.1 讀寫註冊表 442
22.1.1 註冊表的簡單介紹 442
22.1.2 讀寫註冊表功能描述 443
22.1.3 訪問註冊表的BB 444
22.2 檔案目錄的操作 446
22.2.1 列舉所有指定類型檔案 446
22.2.2 記錄日誌檔案 449
22.2.3 設定列印 451
22.2.4 複製移動檔案 455
22.3 Virtools與串口通信 457
22.3.1 串口通信類 457
22.3.2 定義串口通信協定 458
22.3.3 串口通信管理器 461
22.3.4 啟用串口BB 462
22.3.5 從串口中得到數據 463
22.3.6 向串口寫數據 464
22.4 Virtools與Flash整合 466
22.4.1 和Flash整合的原因 466
22.4.2 Flash的封裝 466
22.4.3 封裝一個播放swf檔案的BB 467
第23章 發布應用程式 473
23.1 編譯生成獨立的執行程式 473
23.1.1 關於執行程式的介紹 473
23.1.2 編譯生成Virtools自帶的播放器 474
23.1.3 CustomPlayer類分析 474
23.1.4 CustomPlayerApp類分析 475
附錄A VSL全局函式 478
附錄B Virtools參數類型GUID 481
附錄C 枚舉CK_BEHAVIOR_FLAGS的標識 484
附錄D CKBehavior::SetCallbackFunction回調標準 486
附錄E Virtools訊息使用須知 487
E.1 訊息的接收 487
E.2 訊息的參數 488
附錄F 常用類的標識符類CK_CLASSID 491
參考文獻 493