Unity 3D 內建著色器源碼剖析
熊新科
- 出版商: 人民郵電
- 出版日期: 2019-08-01
- 定價: $534
- 售價: 8.5 折 $454
- 語言: 簡體中文
- ISBN: 711550704X
- ISBN-13: 9787115507044
-
相關分類:
遊戲引擎 Game-engine
立即出貨
買這商品的人也買了...
-
$480$379 -
$458$431 -
$474$450 -
$450$356 -
$505UnityVR 虛擬現實完全自學教程
-
$505游戲設計進階:一種系統方法
-
$536Unity 游戲開發, 3/e (Sams Teach Yourself Unity 2018 Game Development in 24 Hours, 3/e)
-
$580$458 -
$403Unity 3D ShaderLab 開發實戰詳解, 3/e
-
$580$493 -
$658MySQL 基礎教程
-
$505數據驅動游戲運營
-
$594$564 -
$454Unity 3D/2D 移動開發實戰教程
-
$505C++ 遊戲編程:創建 3D遊戲
-
$594$564 -
$594$564 -
$653Unity3D 游戲設計與開發
-
$990$891 -
$294Unity 游戲優化, 2/e (Unity 2017 Game Optimization - Optimize all aspects of Unity performance, 2/e)
-
$602Unity 插件寶典
-
$959游戲設計、原型與開發:基於 Unity 與 C# 從構思到實現, 2/e
-
$620$484 -
$588$559 -
$708$673
相關主題
商品描述
本書既是一本Unity 3D著色器代碼分析教程,也是一本Unity 3D著色器編程參考手冊。全書共12章,主要內容包括:實時3D渲染流水線,輻射度、光度和色度學基本理論,Unity 3D著色器系統,著色器工具函數,Unity 3D引擎的多例化技術,前向渲染和延遲渲染,Unity 3D的全局光照和陰影,UnityShadow Library.cginc文件分析,AutoLight.cginc文件分析,基於物理的光照模型,Unity 3D標準著色器和Standard. shader文件分析,片元著色器實時繪制圖像實戰案例。
本書適合Unity Shader的游戲開發者、程序員閱讀,也可供相關專業人士參考。
作者簡介
熊新科,資深遊戲開發工程師。2003年進入遊戲行業,先後參與多項遊戲的開發。樂於分享技術,活躍於各大Unity技術圈。
目錄大綱
目錄
第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