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

熊新科

  • 出版商: 人民郵電
  • 出版日期: 2019-08-01
  • 售價: $534
  • 貴賓價: 9.5$507
  • 語言: 簡體中文
  • ISBN: 711550704X
  • ISBN-13: 9787115507044
  • 相關分類: Game-engine 遊戲引擎

立即出貨

買這商品的人也買了...

商品描述

本書既是一本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