內容簡介
《Unity 3D ShaderLab開發實戰詳解》全麵講解瞭Unity Shader渲染的實戰技術,全書分為五篇共33章,主要內容為:Shader在3D遊戲中的作用、Shader的實例化、Shader的實現語言等;Unity中Shader的形態、SubShader的重要標簽、可編程Shader、Surface Shader;Shader中用到的各種空間的概念和Shader中的投影矩陣;基本的光照模型;被執行的Pass,包括渲染路徑和Pass的LightMode標簽;VertexLit渲染路徑,包括頂點照明和Unity存放光源的方式;Forward渲染路徑;基於光照貼圖的烘焙照明;基於LightProbes的照明;平麵陰影;球體陰影;體積陰影;映射陰影;內置的陰影;Pass的通用指令開關;固定管綫;Surface Shader;凹凸材質;卡通材質;鏡麵材質;半透明材質;體積霧;Wrap Model新解;麵積光;體積光;材質替代渲染;後期效果;地形;投影;Shader的組織和復用。和你必須知道的渲染概念及基於渲染路徑的優化、移動平颱上的優化等實戰內容,是不可多得的實戰教程。
《Unity 3D ShaderLab開發實戰詳解》適閤移動開發者、遊戲開發者、程序員閱讀,可作為大專院校相關專業的師生用書,也可當作培訓學校的教材。
內頁插圖
目錄
目 錄
第1篇 初識廬山真麵目——Unity 3D Shader
第1章 Shader(著色器)的概念和在3D遊戲中的作用 2
1.1 Shader的概念 2
1.1.1 虛擬世界中的光明和色彩 2
1.1.2 遊戲開發人員的終點 2
1.1.3 Shader(著色器)簡史 2
1.2 Shader的實例化 3
1.3 Shader的實現語言 3
1.3.1 GPU上的編程 3
1.3.2 Unity中的著色器編程 3
第2章 Unity中Shader(著色器)的形態 4
2.1 Unity通過ShaderLab來組織Shader 4
2.1.1 關鍵字Shader 4
2.1.2 使用SubShader組織Shader的不同實現 4
2.1.3 SubShader的重要標簽 4
2.1.4 SubShader中的Pass塊 5
2.1.5 Pass塊的標簽及其名字的意義 5
2.1.6 使用FallBack保證Shader的廣泛適應性 6
2.2 Unity的ShaderLab所支持的Shader編程語言 6
2.3 Unity中Shader的3種形態 6
2.3.1 固定管綫 6
2.3.2 可編程Shader 7
2.3.3 ShaderLab的驕傲:Surface Shader 8
2.4 Shader的數據接口:屬性和uniform變量 8
2.4.1 在Properties塊中定義屬性 8
2.4.2 通過圖形界麵操作屬性 9
2.4.3 通過腳本操控屬性 9
2.4.4 矩陣:不能在屬性塊定義的變量 10
2.4.5 在Cg代碼中使用屬性 10
第3章 Shader(著色器)中用到的各種空間概念 11
3.1 模型空間 11
3.1.1 為什麼用模型空間 11
3.1.2 在腳本和Shader中進齣模型空間 11
3.2 世界坐標空間 11
3.2.1 統一錶達:世界坐標空間 11
3.2.2 在腳本和Shader中進齣世界坐標空間 12
3.3 視空間 12
3.3.1 渲染的需要:視空間 12
3.3.2 在腳本和Shader中進齣視空間 12
3.4 空間的一塊:視錐體 12
3.5 剪切空間 13
3.5.1 投影 13
3.5.2 腳本和Shader中的投影矩陣 13
第4章 基本的光照模型 14
4.1 光源對物體照明的分類 14
4.1.1 間接照明 14
4.1.2 直接照明 14
4.2 照明的計算方式:光照模型 14
4.2.1 漫反射和Lambert 14
4.2.2 鏡麵高光和Phong 15
4.2.3 半角嚮量和BlinnPhong 16
第2篇 讓你的應用更炫彩——Unity中的照明
第5章 第一個被執行的Pass 18
5.1 不同的LightMode被選擇的順序 18
5.1.1 渲染路徑和Pass的LightMode標簽 18
5.1.2 設計可以檢測渲染路徑的材質 18
5.1.3 設計便於檢測渲染路徑的場景 21
5.1.4 VertexLit渲染路徑下Pass的執行 21
5.1.5 Forward渲染路徑下Pass的執行 21
5.1.6 Deferred渲染路徑下Pass的執行 21
5.1.7 不同渲染路徑下的Pass執行規則總結 22
5.2 3個渲染路徑之外 22
5.2.1 LightMode的其他值 22
5.2.2 設計檢測用的材質 23
5.2.3 Always類型的Pass在3種渲染路徑下的執行 24
5.2.4 LightMode的默認值及其在3種渲染路徑下的執行 25
第6章 VertexLit渲染路徑 26
6.1 頂點照明 26
6.1.1 什麼是頂點照明 26
6.1.2 存取光源的變量 26
6.2 頂點照明和Unity存放光源的第一種方式 27
6.2.1 用於調試輸齣的材質 27
6.2.2 設計用於檢測的場景 27
6.2.3 在Vertex Pass中的檢測結果 28
6.2.4 無效數據 28
6.3 頂點照明和Unity存放光源的第二種方式 29
6.3.1 用於調試輸齣的材質 29
6.3.2 設計用於檢測的場景 30
6.3.3 在Vertex Pass中的檢測結果 30
6.4 頂點照明和Unity存放光源的第三種方式 31
6.4.1 Unity為Vertex Pass準備的光源 31
6.4.2 設計用於檢測的場景 31
6.4.3 頂點照明中的點光源 32
6.4.4 計算頂點照明的ShadeVertexLights函數 32
6.4.5 頂點照明中的Pixel光源 33
6.4.6 頂點照明中的平行光 33
6.4.7 頂點照明中的燈光信息小結 35
6.4.8 一個頂點照明的實現例子 35
第7章 Forward渲染路徑 37
7.1 ForwardBase和ForwardAdd 37
7.1.1 設計檢測用的場景和材質 37
7.1.2 ForwardBase和ForwardAdd的錶現 39
7.2 Forward渲染路徑下的重要光源 39
7.2.1 設計檢測用的材質 39
7.2.2 不存在Pixel光源時的情況 40
7.2.3 存在Pixel平行光時的情況 40
7.2.4 存在Pixel點光源時的情況 40
7.2.5 有多種類型的Pixel光源時的情況 41
7.2.6 Forward渲染路徑下的Pixel光源小結 41
7.3 重要光源在ForwardAdd內的執行 41
7.3.1 設計用來檢測Pixel光源的材質 41
7.3.2 設計檢測用的場景 44
7.3.3 檢測結果:ForwardAdd如何被執行 44
7.4 ForwardBase和Unity存放光源的第一種方式 45
7.4.1 設計檢測用的材質 45
7.4.2 第一種方式內的Vertex點光源 46
7.4.3 第一種方式內的平行光 46
7.4.4 第一種方式內的重要Pixel點光源 46
7.4.5 隻有ForwardBase時的情況總結 47
7.4.6 ForwardAdd對ForwardBase內光源的影響 47
7.4.7 有ForwardAdd時存放光源數據第一種方式的總結 49
7.5 ForwardAdd和Unity存放光源的第一種方式 49
7.5.1 設計檢測用的材質 49
7.5.2 設計檢測用的場景 50
7.5.3 ForwardAdd內的Pixel光源 50
7.5.4 ForwardAdd內的平行光 51
7.5.5 數組變量unity_4LightPos的使用情況分析 51
7.6 Forward渲染路徑和Unity存放光源的第三種方式 51
7.6.1 檢測ForwardBase內情況的材質 51
7.6.2 檢測結果:第三種方式不包含對ForwardBase有效的數據 52
7.6.3 檢測結果:第三種方式不包含對ForwardAdd有效的數據 52
7.7 Forward渲染路徑總結 53
7.7.1 Forward渲染路徑下材質的適應性 53
7.7.2 Unity如何為Forward渲染路徑設置光源 53
第8章 基於光照貼圖的烘焙照明 54
8.1 單光照貼圖和VertexLit渲染路徑 54
8.1.1 測試烘焙的場景 54
8.1.2 烘焙場景中使用的材質 55
8.1.3 烘焙的前提:靜態物體 55
8.1.4 如何在烘焙中使用自發光材質 55
8.1.5 烘焙之後靜態物體和非靜態物體的實時照明 57
8.1.6 應用光照貼圖到VertexLit渲染路徑下的材質中 57
8.1.7 通過自己的材質改變實時光源對烘焙後物體的照明 59
8.2 在效果和性能間進行權衡 60
8.2.1 影響全局的Resolution選項 60
8.2.2 影響單個物體的Scale In Lightmap選項 61
8.3 單光照貼圖和Forward渲染路徑 62
8.3.1 單光照貼圖在VertexLit和Forward下麵的不同錶現 62
8.3.2 準備可應用於烘焙的自發光材質 62
8.3.3 在ForwardBase內計算光照貼圖 64
8.3.4 Forward渲染路徑下烘焙之後的實時照明 65
8.4 單光照貼圖在Deferred渲染路徑下的實時陰影 67
8.5 雙光照貼圖和Deferred渲染路徑 67
8.5.1 全局GI、間接照明以及雙光照貼圖 67
8.5.2 混閤雙光照貼圖和實時照明 67
8.5.3 觀察混閤過程 69
8.5.4 雙光照貼圖的使用限製 70
8.6 雙光照貼圖和Forward渲染路徑 71
8.7 方嚮光照貼圖和Forward渲染路徑 71
8.7.1 烘焙後的凹凸問題 71
8.7.2 方嚮光照貼圖(Direction Lightmaps)和凹凸貼圖 72
第9章 基於LightProbes的照明 74
9.1 初識LightProbes 74
9.1.1 LightProbes照明的優點 74
9.1.2 檢測LightProbes照明的場景 74
9.1.3 使用Light Probe Group進行管理 76
9.1.4 烘焙場景光照信息到LightProbes中 76
9.1.5 對比Light Probes照明和實時照明 77
9.2 放置LightProbes的注意事項 77
9.2.1 必須形成一個體積 77
9.2.2 單個Light Probe必須處於采樣光源的照射範圍 77
9.3 動態更新LightProbes 78
9.3.1 跟新數據的注意事項 78
9.3.2 更改不同通道的Coefficient 78
9.4 照明采樣的Archor Override 79
9.4.1 基於綫性插值的采樣 79
9.4.2 改變默認的插值位置 79
9.5 LightProbes照明和陰影 80
9.5.1 LightProbes和光照貼圖的異同 80
9.5.2 烘焙陰影時可能會犯的錯誤 80
9.5.3 將靜態物體的陰影烘焙到Light Probe上 81
9.5.4 LightProbes照明和實時陰影的混閤 82
9.6 烘焙一個色彩豐富的場景 82
9.7 在自己的材質中使用LightProbes 83
9.7.1 為Forward渲染路徑的材質計算LightProbes 84
9.7.2 使用ShadeSH9函數 84
9.7.3 在一個Surface Shader中進行計算 85
第3篇 使應用更逼真——Shadows(陰影)
第10章 平麵陰影 88
10.1 平行光對平麵的投影 88
10.1.1 對平行光投影的考慮 88
10.1.2 進齣陰影接受平麵的矩陣 88
10.1.3 使用三角形相似計算陰影 89
10.2 點光源對平麵的投影 90
10.3 陰影的淡齣 91
10.3.1 有效利用計算平麵陰影過程中的數據 91
10.3.2 潛在的問題 91
第11章 球體陰影 92
11.1 平行光對球體的投影 92
11.1.1 投影球體的信息 92
11.1.2 使用相似三角形計算投影 92
11.2 陰影的淡入/淡齣 93
11.3 點光源對球體的投影 94
第12章 體積陰影 95
12.1 將頂點沿某一方嚮擠齣 95
12.1.1 在Vertex函數中操作 95
12.1.2 判斷頂點是嚮光還是背光 95
12.2 從Volumes中找到陰影區域 96
12.2.1 兩次擠齣 96
12.2.2 計算齣陰影區域 97
12.2.3 渲染陰影 97
12.2.4 需要注意的問題 98
第13章 陰影映射 99
13.1 燈光空間和相機空間 99
13.1.1 觀察兩個空間 99
13.1.2 兩個視角的Z深度 99
13.1.3 渲染Z深度的材質 99
13.2 投射Z深度 100
13.2.1 準備燈光視角的投影矩陣 100
13.2.2 在材質中計算投影後的Z深度 101
13.3 比較Z深度 103
13.3.1 比較Z深度的材質 103
13.3.2 Z精度引起的問題 104
13.3.3 增加Z的精度 104
13.3.4 對Z值進行偏移 105
第14章 內置的陰影 107
14.1 投射陰影 107
14.1.1 使用ShadowCaster投射陰影 107
14.1.2 ShadowCaster裏都做瞭什麼 108
14.1.3 寫一個自己的ShadowCaster 108
14.1.4 改變ShadowCaster的行為 109
14.1.5 陰影和FallBack機製 110
14.2 接受陰影 111
14.3 Surface Shader和陰影 112
14.3.1 Surface Shader的陰影和Fallback 112
14.3.2 Surface Shader裏的燈光參數和陰影 112
14.3.3 Surface Shader對Forward渲染路徑下陰影的支持 112
第4篇 Unity中的各種Shader
第15章 Pass的通用指令開關 116
15.1 使用LOD在運行時決定材質 116
15.1.1 材質的LOD 116
15.1.2 運行時設定單個材質的LOD 116
15.1.3 設定全局所有材質的LOD 117
15.1.4 Unity內置的LOD層級 118
15.2 渲染隊列 118
15.2.1 標簽隊列和渲染順序 118
15.2.2 渲染隊列和ZTest判斷 120
15.2.3 Unity中內置的渲染隊列 120
15.3 透明的産生 120
15.3.1 Alpha檢測和8種比較條件 120
15.3.2 動態生成AlphaTest的材質 120
15.3.3 動態生成Shader的內容 121
15.3.4 結閤AlphaTest和Blend操作 122
15.4 混閤操作 123
15.4.1 什麼是混閤(Blend)操作 123
15.4.2 動態生成測試用的材質 123
15.4.3 生成Shader的代碼 124
15.4.4 檢測不同的混閤操作 125
15.4.5 BlendOp選項 126
15.4.6 動態生成帶BlendOp選項的材質 126
15.4.7 生成Shader的代碼 127
15.4.8 檢測BlendOp操作 127
15.5 使用通道遮罩(ColorMask) 128
15.5.1 ColorMask的作用 128
15.5.2 檢測ColorMask 128
15.5.3 一個使用ColorMask的例子 129
15.6 ZTest(深度測試) 130
15.6.1 存取場景的ZTest 130
15.6.2 RenderType標簽和生成ZTest的關聯 130
15.6.3 內置RenderType的值 131
15.6.4 Forward渲染路徑下的ZTest 131
15.6.5 Deferred渲染路徑下的ZTest 132
15.7 對Z深度的偏移 134
15.7.1 乾預正常ZTest的手段 134
15.7.2 動態改變Offset的參數 134
15.7.3 觀察Offset在不同應用條件下的錶現 135
15.8 麵的剔除操作 135
15.9 自動貼圖坐標的生成 136
15.9.1 ObjectLinear和等價的Cg代碼 136
15.9.2 EyeLinear和等價的Cg代碼 137
15.9.3 SphereMap和等價的Cg代碼 138
15.9.4 CubeReflect和等價的Cg代碼 139
15.9.5 CubeNormal和等價的Cg代碼 139
15.10 抓屏操作 140
15.10.1 如何使用GrabPass 140
15.10.2 一個模擬麯麵反射的例子 141
15.11 Fog(霧效) 142
15.11.1 Fog和Unity的3種實現 142
15.11.2 材質中對Fog的控製 142
15.11.3 實現自己的Fog 143
第16章 固定管綫 146
16.1 Unity中固定管綫的基本形態 146
16.1.1 基本形態 146
16.1.2 與照明相關的
Unity 3D ShaderLab開發實戰詳解 下載 mobi epub pdf txt 電子書