Unity 3D 內建著色器源碼剖析 ,

作者:熊新科

出版社:人民郵電出版社

ISBN:9787115507044

$37.50

產品號碼: 126301 貨號: 9787115507044 分類: , 標籤: , ,

本書既是一本Unity 3D著色器代碼分析教程,也是一本Unity 3D著色器程式設計參考手冊。全書共12章,主要內容包括:即時3D渲染流水線,輻射度、光度和色度學基本理論,Unity 3D著色器系統,著色器工具函數,Unity 3D引擎的多例化技術,前向渲染和延遲渲染,Unity 3D的全域光照和陰影,UnityShadow Library.cginc檔分析,AutoLight.cginc檔分析,基於物理的光照模型,Unity 3D標準著色器和Standard. shader檔分析,片元著色器即時繪製圖像實戰案例。本書適合Unity Shader的遊戲開發者、程式師閱讀,也可供相關專業人士參考。
 

目錄

第1章 即時3D渲染流水線 1
1.1 概述 1
1.2 頂點處理階段 2
1.2.1 頂點的組織方式 2
1.2.2 坐標系統和頂點法線的確定方式 3
1.2.3 把頂點從模型空間變換到世界空間 5
1.2.4 把頂點從世界空間變換到觀察空間 9
1.2.5 把頂點從觀察空間變換到裁剪空間 11
1.3 光柵化階段 18
1.3.1 裁剪操作 18
1.3.2 透視除法 18
1.3.3 背面剔除操作 19
1.3.4 視口變換 21
1.3.5 掃描轉換 22
1.4 片元處理與輸出合併階段 22
1.4.1 紋理操作 23
1.4.2 輸出合併中的深度值操作 24
1.4.3 輸出合併中的Alpha值操作 26
1.4.4 Unity 3D ShaderLab中的Alpha混合指令及深度測試指令 27

第2章 輻射度、光度和色度學基本理論 30
2.1 輻射度學基本理論 30
2.1.1 立體角 32
2.1.2 點光源、輻射強度和輻射亮度 33
2.1.3 輻射出射度和輻射入射度 34
2.2 光度學基本理論 34
2.3 色度學基本理論 36
2.3.1 什麼是顏色 36
2.3.2 顏色的數位化及CIE1931-RGB色彩模型 37
2.3.3 CIE1931-XYZ色彩模型 40
2.3.4 CIE1931-Yxy色彩模型 40
2.4 伽馬校正和sRGB顏色空間 40
2.4.1 伽馬校正 40
2.4.2 sRGB顏色空間 44
2.4.3 Unity 3D中的伽馬空間和線性空間 45

第3章 Unity 3D著色器系統 47
3.1 從一個外觀著色器程式談起 47
3.1.1 BasicDiffuse著色器展開後的代碼分析 49
3.1.2 外觀著色器的編譯指示符 56
3.1.3 傳給外觀著色器函數的參數 58
3.2 直接編寫頂點著色器和片元著色器 59
3.2.1 用Cg語言編寫的包含著色器功能的代碼片段 59
3.2.2 聲明目標渲染器 60
3.2.3 著色器的語義 61
3.3 在Cg代碼中訪問著色器屬性塊 66
3.3.1 在著色器代碼中聲明材質屬性 66
3.3.2 在著色器代碼中聲明對應於材質屬性的變數 67
3.4 使用著色器多樣體處理多種情況 67
3.4.1 編譯指示符multi_compile和shader_feature的使用方式與區別 67
3.4.2 多樣體關鍵字的使用限制 68
3.4.3 內置的multi_compile指示符快捷使用方式 68
3.5 多平臺著色器代碼的支持 68
3.6 確定著色器編譯器的版本 69
3.6.1 和著色器編譯器版本相關的宏 69
3.6.2 消除著色器代碼中各平臺的語義差異性 70
3.6.3 關閉可忽視的編譯警告 72
3.6.4 Unity 3D Shader的基底資料型別 72
3.6.5 消除平臺差異性 73
3.6.6 統一著色器常量緩衝區的巨集定義 75
3.6.7 HLSL語言中的分支預測特性 75

第4章 引擎提供的著色器工具函數和資料結構 78
4.1 UnityShaderVariables.cginc檔中的著色器常量和函數 78
4.1.1 進行變換操作用的矩陣 78
4.1.2 和攝像機相關的常量緩衝區 81
4.1.3 與光照相關的工具函數和內置光源 83
4.1.4 與陰影相關的著色器常量緩衝區 84
4.1.5 與逐幀繪製調用相關的著色器常量緩衝區 86
4.1.6 與霧效果相關的常量緩衝區 86
4.1.7 與光照貼圖相關的常量緩衝區 87
4.2 UnityCG.cginc檔中的工具函數和巨集 90
4.2.1 數學常數 90
4.2.2 與顏色空間相關的常數和工具函數 90
4.2.3 描述頂點佈局格式的結構體 92
4.2.4 用於進行空間變換的工具函數 93
4.2.5 與光照計算相關的工具函數 97
4.2.6 與HDR及光照貼圖顏色編解碼相關的工具函數 102
4.2.7 把高精度資料編碼到低精度緩衝區的函數 107
4.2.8 法線貼圖及其編解碼操作的函數 110
4.2.9 線性化深度值的工具函數 113
4.2.10 合併單程立體渲染時的左右眼圖像到一張紋理的函數 115
4.2.11 用來實現圖像效果的工具函數和預定義結構體 117
4.2.12 計算螢幕座標的工具函數 118
4.2.13 與陰影處理相關的工具函數 121
4.2.14 與霧效果相關的工具函數和巨集 123

第5章 Unity 3D引擎的多例化技術 128
5.1 多例化技術概述 128
5.1.1 不使用GPU多例化技術繪製多個相同模型的偽代碼 128
5.1.2 在Direct3D 11中設置輸入組裝階段的示例偽代碼 128
5.1.3 設置頂點輸入組裝佈局 129
5.1.4 頂點著色器和片元著色器中對使用GPU多例化技術的對應設置 129
5.2 如何在材質中啟用多例化技術 130
5.3 添加逐實例資料 131
5.3.1 在外觀著色器中給材質顏色變數增加GPU多例化支持的代碼 131
5.3.2 在C#層改變game object中的多例化材質顏色屬性 132
5.4 在頂點著色器和片元著色器中使用多例化技術 132
5.4.1 在頂點著色器和片元著色器中啟用GPU多例化技術 132
5.4.2 UNITY_VERTEX_INPUT_INSTANCE_ID宏的定義 133
5.4.3 DEFAULT_UNITY_VERTEX_INPUT_INSTANCE_ID宏的定義 133
5.4.4 UNITY_INSTANCING_BUFFER_START及另外兩個配套的宏的定義 134
5.4.5 UNITY_INSTANCED_ARRAY_SIZE宏的定義 135
5.4.6 UNITY_SETUP_INSTANCE_ID宏的定義 135
5.4.7 DEFAULT_UNITY_SETUP_INSTANCE_ID和UNITY_TRANSFER_INSTANCE_ID宏的定義 135
5.4.8 著色器常量緩衝區UnityDrawCallInfo的定義 136
5.4.9 5.4.1節中展開多例化相關的宏之後的代碼 137

第6章 前向渲染和延遲渲染 139
6.1 前向渲染概述 139
6.2 延遲渲染概述 139
6.3 Unity 3D中的各種渲染途徑 141
6.3.1 Unity 3D的前向渲染途徑細節 142
6.3.2 Unity 3D的延遲渲染途徑細節 144

第7章 Unity 3D的全域光照和陰影 147
7.1 全域照明和局部照明 147
7.2 引擎提供的光源類型 149
7.2.1 點光源 149
7.2.2 聚光燈光源 150
7.2.3 有向平行光源 150
7.2.4 區域面光源 150
7.2.5 cookie 151
7.3 使用即時模式光源進行全域照明 151
7.4 使用烘焙式光照貼圖進行全域照明 152
7.5 使用混合光照進行全域照明 153
7.5.1 Baked Indirect照明模式 154
7.5.2 Shadowmask照明模式 154
7.5.3 Subtractive照明模式 155
7.6 光探針照明的細節 156
7.6.1 光探針照明概述 156
7.6.2 在場景中佈置光探針 157
7.6.3 使用光探針 157
7.6.4 光探針代理體 158
7.6.5 反射用光探針 158
7.7 探討基於球諧函數的全域光照 160
7.7.1 半球空間的光照方程 161
7.7.2 蒙特卡洛積分估算法的定義 161
7.7.3 球諧函數 163
7.7.4 正交對偶基函數和球諧光照 166
7.7.5 Unity 3D中的球諧光照 169
7.8 引擎中的渲染陰影的功能 175
7.8.1 在光源空間中確定產生陰影的區域 175
7.8.2 在螢幕空間中確定產生陰影的區域 175
7.8.3 如何啟用陰影 175
7.8.4 透視走樣和層疊式陰影貼圖 177

第8章 UnityShadowLibrary.cginc 檔分析 179
8.1 陰影與全域照明系統的關係 179
8.2 聚光燈光源生成的陰影 179
8.2.1 啟用SPOT宏 179
8.2.2 UNITY_DECLARE_SHADOWMAP宏的定義 180
8.2.3 SAMPLE_DEPTH_TEXTURE及類似的宏 181
8.2.4 UnitySampleShadowmap函數版本1 182
8.2.5 UnitySampleShadowmap函數版本2 183
8.3 點光源生成的陰影 183
8.3.1 從立方體紋理貼圖中取得紋素對應的深度值 183
8.3.2 對採樣值進行混合計算 184
8.4 預烘焙的陰影 185
8.4.1 LPPV_SampleProbeOcclusion函數 185
8.4.2 UnitySampleBakedOcclusion函數版本1 186
8.4.3 UNITY_SAMPLE_TEX2D_SAMPLER宏的定義 186
8.4.4 UnitySampleBakedOcclusion函數版本2 187
8.4.5 UnityGetRawBakedOcclusions函數 187
8.4.6 UnityMixRealtimeAndBakedShadows函數 188
8.5 陰影的淡化處理 188
8.5.1 UnityComputeShadowFadeDistance函數和UnityCompute
ShadowFade函數 188
8.5.2 梯度計算 189
8.6 計算深度陰影的偏移值 190
8.6.1 UnityGetReceiverPlaneDepthBias函數 192
8.6.2 UnityCombineShadowcoordComponents函數 192
8.7 PCF陰影過濾的相關函數 193
8.7.1 UnitySampleShadowmap_PCF3x3NoHardwareSupport函數 194
8.7.2 用於進行PCF過濾的輔助函數 195
8.7.3 執行PCF過濾操作的函數 199
8.7.4 基於3×3內核高斯模糊的PCF過濾操作 200

第9章 AutoLight.cginc檔分析 203
9.1 DIRECTIONAL宏的定義 203
9.2 有向平行光產生的基於螢幕空間的陰影的相關函數 203
9.2.1 啟用UNITY_NO_SCREENSPACE_SHADOWS巨集時TRANSFER_SHADOW巨集的定義 203
9.2.2 啟用UNITY_NO_SCREENSPACE_SHADOWS巨集時的unitySampleShadow函數 204
9.2.3 未啟用UNITY_NO_SCREENSPACE_SHADOWS巨集時TRANSFER_SHADOW巨集的定義 204
9.2.4 UNITY_SAMPLE_SCREEN_SHADOW宏和UNITY_DECLARE_SCREENSPACE_ SHADOWMAP宏的定義 205
9.3 Unity 3D 5.6版本後的陰影和光照計算工具函數 205
9.3.1 UnityComputeForwardShadows函數 205
9.3.2 不同編譯條件下的UNITY_SHADOW_COORDS、UNITY_TRANSFER_SHADOW和UNITY_SHADOW_ATTENUATION宏的定義 206
9.3.3 計算點光源的光亮度衰減的宏 209
9.3.4 計算聚光燈光源的光亮度衰減的宏 209
9.3.5 計算有向平行光源的光亮度衰減的宏 211
9.3.6 計算帶cookie的點光源的光亮度衰減的宏 211
9.3.7 計算帶cookie的有向平行光源的光亮度衰減的宏 212

第10章 基於物理的光照模型 213
10.1 漫反射和Lambert光照模型 213
10.2 鏡面反射和Phong光照模型 214
10.3 Blinn-Phong光照模型 215
10.4 基於物理的光照模型的相關概念 216
10.4.1 光的折射和折射率 216
10.4.2 均勻介質 217
10.4.3 散射 217
10.4.4 雙向反射分佈函數 218
10.4.5 菲涅爾反射 220
10.4.6 微表面和Cook-Torrance模型 223
10.4.7 定義菲涅爾方程 225
10.4.8 Cook-Torrance BRDF模型 226

第11章 Unity 3D標準著色器和 Standard.shader檔分析 227
11.1 標準著色器中的各項材質屬性 227
11.1.1 Rendering Mode屬性 227
11.1.2 Albedo屬性 228
11.1.3 Metal屬性 228
11.1.4 Smoothness屬性 229
11.1.5 Normal Map屬性 230
11.1.6 Height Map屬性 230
11.1.7 Occlusion屬性 234
11.1.8 Emission屬性 235
11.1.9 Secondary Map屬性 235
11.1.10 Detail Mask屬性 236
11.2 Standard.shader中的屬性變數 236
11.2.1 Standard.shader程式碼片段中的屬性變數 236
11.2.2 Standard.shader程式碼片段中的MetallicSetup函數 237
11.3 第一個SubShader的前向通路 238
11.3.1 前向通路的簡化版頂點著色器入口函數 239
11.3.2 前向通路的簡化版片元著色器入口函數 247
11.3.3 前向通路的簡化版著色器流程 254
11.3.4 前向通路的標準版頂點著色器入口函數 255
11.3.5 前向通路的標準版片元著色器入口函數 258
11.3.6 前向通路的標準版著色器流程 263
11.4 第一個SubShader的FORWARD_DELTA通路 263
11.4.1 FORWARD_DELTA通路的簡化版頂點著色器入口函數 263
11.4.2 FORWARD_DELTA通路的簡化版片元著色器入口函數 265
11.4.3 FORWARD_DELTA通路的簡化版著色器流程 267
11.4.4 FORWARD_DELTA通路的標準版頂點著色器入口函數 268
11.4.5 FORWARD_DELTA通路的標準版片元著色器入口函數 270
11.4.6 FORWARD_DELTA通路的標準版著色器流程 271
11.5 第一個SubShader的ShadowCaster通路 272
11.5.1 ShadowCaster通路的編譯指示符以及著色器變數和巨集 273
11.5.2 ShadowCaster通路的頂點著色器入口函數 275
11.5.3 ShadowCaster通路的片元著色器入口函數 278
11.6 第一個SubShader的延遲通路 281
11.6.1 延遲通路的頂點著色器入口函數 281
11.6.2 延遲通路的片元著色器入口函數 282
11.7 第一個SubShader的元渲染通路 284
11.7.1 元渲染通路的頂點著色器入口函數 284
11.7.2 元渲染通路的片元著色器入口函數 285
11.8 UnityStandardInput.cginc的結構體、著色器變數、宏和函數 286
11.8.1 檔中預定義的宏 286
11.8.2 VertexInput結構體 287
11.8.3 TexCoords函數 287
11.8.4 DetailMask函數 288
11.8.5 Albedo函數 288
11.8.6 Alpha函數 289
11.8.7 Occlusion函數 289
11.8.8 MetallicGloss函數 289
11.8.9 Emission函數 290
11.8.10 NormalInTangentSpace函數 290
11.8.11 Parallax函數 291
11.9 UnityStandardUtils.cginc的結構體、著色器變數、宏和函數 292
11.9.1 PreMultiplyAlpha函數 292
11.9.2 OneMinusReflectivityFrom Metallic函數 292
11.9.3 DiffuseAndSpecularFrom Metallic函數 293
11.9.4 LerpWhiteTo函數 293
11.9.5 LerpOneTo函數 293
11.9.6 ParallaxOffset1Step函數 294
11.9.7 UnpackScaleNormalRGorAG函數 294
11.9.8 UnpackScaleNormal函數 295
11.9.9 BlendNormals函數 295
11.9.10 CreateTangentToWorldPer Vertex函數 295
11.9.11 ShadeSHPerVertex函數 295
11.9.12 ShadeSHPerPixel函數 296
11.9.13 BoxProjectedCubemap Direction函數 296
11.10 UnityImageBasedLighting.cginc的結構體、著色器變數、宏和函數 299
11.10.1 Unity_GlossyEnvironmentData結構體 299
11.10.2 UnityGlossyEnvironmentSetup 函數 300
11.10.3 Unity_GlossyEnvironment函數 300
11.10.4 perceptualRoughnessTo MipmapLevel函數 301
11.11 UnityGlobalIllumination.cginc的結構體、著色器變數、宏和函數 301
11.11.1 ResetUnityLight函數 301
11.11.2 SubtractMainLightWithReal timeAttenuationFromLightmap函數 302
11.11.3 UnityGI_Base函數 302
11.11.4 UnityGI_IndirectSpecular函數 304
11.11.5 UnityGlobalIllumination函數版本1 305
11.11.6 UnityGlobalIllumination函數版本2 305
11.12 UnityStandardBRDF.cginc的結構體、著色器變數、宏和函數 305
11.12.1 PerceptualRoughnessTo Roughness函數 306
11.12.2 RoughnessToPerceptual Roughness函數 306
11.12.3 SmoothnessToRoughness函數 306
11.12.4 SmoothnessToPerceptual Roughness函數 306
11.12.5 Pow4函數的4個不同版本 307
11.12.6 Pow5函數的4個不同版本 307
11.12.7 FresnelTerm函數 307
11.12.8 FresnelLerp函數 308
11.12.9 FresnelLerpFast函數 308
11.12.10 DisneyDiffuse函數 308
11.12.11 SmithJointGGXVisibilityTerm函數 309
11.12.12 GGXTerm函數 309
11.12.13 BRDF3_Indirect函數 310
11.12.14 BRDF3_Direct函數 310
11.12.15 BRDF3_Unity_PBS函數 311
11.12.16 BRDF2_Unity_PBS函數 311
11.12.17 BRDF1_Unity_PBS函數 313
11.13 UnityGBuffer.cginc的結構體、著色器變數、宏和函數 314
11.13.1 UnityStandardData結構體 314
11.13.2 UnityStandardDataToGbuffer函數 315
11.14 UnityMetaPass.cginc的結構體、著色器變數、宏和函數 315
11.14.1 UnityMetaPass常量緩衝區 315
11.14.2 UnityMetaInput結構體 315
11.14.3 UnityMetaVertexPosition函數 316
11.14.4 UnityMetaFragment函數 316

第12章 實戰—在片元著色器用演算法即時繪製圖像 318
12.1 搭建繪圖環境 319
12.2 設計繪製場景的著色器 320
12.2.1 頂點著色器所需的資料結構和實現 320
12.2.2 判斷某點是否在三角形內 321
12.2.3 基於距離場判定片元的顏色 322
12.2.4 定義五角星幾何體資料 326
12.2.5 判斷某點是否在圓及矩形內 328
12.2.6 定義和繪製場景中的幾何體 331
 

作者介紹

熊新科,資深遊戲開發工程師。2003年進入遊戲行業,先後參與多項遊戲的開發。樂於分享技術,活躍於各大Unity技術圈。
 

出版地

大陸

出版日期

07/01/2019

印刷

單色印刷

版別

初版

裝訂

平裝

語系

簡體中文