關于我們
書單推薦
新書推薦
|
Unity 3D 內(nèi)建著色器源碼剖析
本書既是一本Unity 3D著色器代碼分析教程,也是一本Unity 3D著色器編程參考手冊。全書共12章,主要內(nèi)容包括:實時3D渲染流水線,輻射度、光度和色度學基本理論,Unity 3D著色器系統(tǒng),著色器工具函數(shù),Unity 3D引擎的多例化技術,前向渲染和延遲渲染,Unity 3D的全局光照和陰影,UnityShadow Library.cginc文件分析,AutoLight.cginc文件分析,基于物理的光照模型,Unity 3D標準著色器和Standard. shader文件分析,片元著色器實時繪制圖像實戰(zhàn)案例。
本書適合Unity Shader的游戲開發(fā)者、程序員閱讀,也可供相關專業(yè)人士參考。
第 一本Unity源碼分析的圖書
聯(lián)系輻射度學、光度學、色度學等物理理論,從物理學角度上闡述著色器所需要的基礎知識
剖析內(nèi)建著色器庫中的若干工具庫函數(shù),闡述清楚原理,讓讀者深入理解,能在開發(fā)階段中有效使用
剖析內(nèi)建著色器庫中的標準材質,以及若干常用的著色器程序的實現(xiàn)原理,讓讀者能深入學習到當前流行的渲染技術的實現(xiàn)原理,并融會貫通到實際開發(fā)工作中
熊新科,資深游戲開發(fā)工程師。2003年進入游戲行業(yè),先后參與多項游戲的開發(fā)。樂于分享技術,活躍于各大Unity技術圈。
目 錄 第 1章 實時3D渲染流水線 1 1.1 概述 1 1.2 頂點處理階段 2 1.2.1 頂點的組織方式 2 1.2.2 坐標系統(tǒng)和頂點法線的確定方式 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 顏色的數(shù)字化及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著色器系統(tǒng) 47 3.1 從一個外觀著色器程序談起 47 3.1.1 BasicDiffuse著色器展開后的代碼分析 49 3.1.2 外觀著色器的編譯指示符 56 3.1.3 傳給外觀著色器函數(shù)的參數(shù) 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的使用方式與區(qū)別 67 3.4.2 多樣體關鍵字的使用限制 68 3.4.3 內(nèi)置的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的基本數(shù)據(jù)類型 72 3.6.5 消除平臺差異性 73 3.6.6 統(tǒng)一著色器常量緩沖區(qū)的宏定義 75 3.6.7 HLSL語言中的分支預測特性 75 第4章 引擎提供的著色器工具函數(shù)和數(shù)據(jù)結構 78 4.1 UnityShaderVariables.cginc文件中的著色器常量和函數(shù) 78 4.1.1 進行變換操作用的矩陣 78 4.1.2 和攝像機相關的常量緩沖區(qū) 81 4.1.3 與光照相關的工具函數(shù)和內(nèi)置光源 83 4.1.4 與陰影相關的著色器常量緩沖區(qū) 84 4.1.5 與逐幀繪制調用相關的著色器常量緩沖區(qū) 86 4.1.6 與霧效果相關的常量緩沖區(qū) 86 4.1.7 與光照貼圖相關的常量緩沖區(qū) 87 4.2 UnityCG.cginc文件中的工具函數(shù)和宏 90 4.2.1 數(shù)學常數(shù) 90 4.2.2 與顏色空間相關的常數(shù)和工具函數(shù) 90 4.2.3 描述頂點布局格式的結構體 92 4.2.4 用于進行空間變換的工具函數(shù) 93 4.2.5 與光照計算相關的工具函數(shù) 97 4.2.6 與HDR及光照貼圖顏色編解碼相關的工具函數(shù) 102 4.2.7 把高精度數(shù)據(jù)編碼到低精度緩沖區(qū)的函數(shù) 107 4.2.8 法線貼圖及其編解碼操作的函數(shù) 110 4.2.9 線性化深度值的工具函數(shù) 113 4.2.10 合并單程立體渲染時的左右眼圖像到一張紋理的函數(shù) 115 4.2.11 用來實現(xiàn)圖像效果的工具函數(shù)和預定義結構體 117 4.2.12 計算屏幕坐標的工具函數(shù) 118 4.2.13 與陰影處理相關的工具函數(shù) 121 4.2.14 與霧效果相關的工具函數(shù)和宏 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 添加逐實例數(shù)據(jù) 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 著色器常量緩沖區(qū)UnityDrawCallInfo的定義 136 5.4.9 5.4.1節(jié)中展開多例化相關的宏之后的代碼 137 第6章 前向渲染和延遲渲染 139 6.1 前向渲染概述 139 6.2 延遲渲染概述 139 6.3 Unity 3D中的各種渲染途徑 141 6.3.1 Unity 3D的前向渲染途徑細節(jié) 142 6.3.2 Unity 3D的延遲渲染途徑細節(jié) 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 區(qū)域面光源 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 光探針照明的細節(jié) 156 7.6.1 光探針照明概述 156 7.6.2 在場景中布置光探針 157 7.6.3 使用光探針 157 7.6.4 光探針代理體 158 7.6.5 反射用光探針 158 7.7 探討基于球諧函數(shù)的全局光照 160 7.7.1 半球空間的光照方程 161 7.7.2 蒙特卡洛積分估算法的定義 161 7.7.3 球諧函數(shù) 163 7.7.4 正交對偶基函數(shù)和球諧光照 166 7.7.5 Unity 3D中的球諧光照 169 7.8 引擎中的渲染陰影的功能 175 7.8.1 在光源空間中確定產(chǎn)生陰影的區(qū)域 175 7.8.2 在屏幕空間中確定產(chǎn)生陰影的區(qū)域 175 7.8.3 如何啟用陰影 175 7.8.4 透視走樣和層疊式陰影貼圖 177 第8章 UnityShadowLibrary.cginc 文件分析 179 8.1 陰影與全局照明系統(tǒng)的關系 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函數(shù)版本1 182 8.2.5 UnitySampleShadowmap函數(shù)版本2 183 8.3 點光源生成的陰影 183 8.3.1 從立方體紋理貼圖中取得紋素對應的深度值 183 8.3.2 對采樣值進行混合計算 184 8.4 預烘焙的陰影 185 8.4.1 LPPV_SampleProbeOcclusion函數(shù) 185 8.4.2 UnitySampleBakedOcclusion函數(shù)版本1 186 8.4.3 UNITY_SAMPLE_TEX2D_SAMPLER宏的定義 186 8.4.4 UnitySampleBakedOcclusion函數(shù)版本2 187 8.4.5 UnityGetRawBakedOcclusions函數(shù) 187 8.4.6 UnityMixRealtimeAndBakedShadows函數(shù) 188 8.5 陰影的淡化處理 188 8.5.1 UnityComputeShadowFadeDistance函數(shù)和UnityCompute ShadowFade函數(shù) 188 8.5.2 梯度計算 189 8.6 計算深度陰影的偏移值 190 8.6.1 UnityGetReceiverPlaneDepthBias函數(shù) 192 8.6.2 UnityCombineShadowcoordComponents函數(shù) 192 8.7 PCF陰影過濾的相關函數(shù) 193 8.7.1 UnitySampleShadowmap_PCF3x3NoHardwareSupport函數(shù) 194 8.7.2 用于進行PCF過濾的輔助函數(shù) 195 8.7.3 執(zhí)行PCF過濾操作的函數(shù) 199 8.7.4 基于33內(nèi)核高斯模糊的PCF過濾操作 200 第9章 AutoLight.cginc文件分析 203 9.1 DIRECTIONAL宏的定義 203 9.2 有向平行光產(chǎn)生的基于屏幕空間的陰影的相關函數(shù) 203 9.2.1 啟用UNITY_NO_SCREENSPACE_SHADOWS宏時TRANSFER_SHADOW宏的定義 203 9.2.2 啟用UNITY_NO_SCREENSPACE_SHADOWS宏時的unitySampleShadow函數(shù) 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版本后的陰影和光照計算工具函數(shù) 205 9.3.1 UnityComputeForwardShadows函數(shù) 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 雙向反射分布函數(shù) 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函數(shù) 237 11.3 第 一個SubShader的前向通路 238 11.3.1 前向通路的簡化版頂點著色器入口函數(shù) 239 11.3.2 前向通路的簡化版片元著色器入口函數(shù) 247 11.3.3 前向通路的簡化版著色器流程 254 11.3.4 前向通路的標準版頂點著色器入口函數(shù) 255 11.3.5 前向通路的標準版片元著色器入口函數(shù) 258 11.3.6 前向通路的標準版著色器流程 263 11.4 第 一個SubShader的FORWARD_DELTA通路 263 11.4.1 FORWARD_DELTA通路的簡化版頂點著色器入口函數(shù) 263 11.4.2 FORWARD_DELTA通路的簡化版片元著色器入口函數(shù) 265 11.4.3 FORWARD_DELTA通路的簡化版著色器流程 267 11.4.4 FORWARD_DELTA通路的標準版頂點著色器入口函數(shù) 268 11.4.5 FORWARD_DELTA通路的標準版片元著色器入口函數(shù) 270 11.4.6 FORWARD_DELTA通路的標準版著色器流程 271 11.5 第 一個SubShader的ShadowCaster通路 272 11.5.1 ShadowCaster通路的編譯指示符以及著色器變量和宏 273 11.5.2 ShadowCaster通路的頂點著色器入口函數(shù) 275 11.5.3 ShadowCaster通路的片元著色器入口函數(shù) 278 11.6 第 一個SubShader的延遲通路 281 11.6.1 延遲通路的頂點著色器入口函數(shù) 281 11.6.2 延遲通路的片元著色器入口函數(shù) 282 11.7 第 一個SubShader的元渲染通路 284 11.7.1 元渲染通路的頂點著色器入口函數(shù) 284 11.7.2 元渲染通路的片元著色器入口函數(shù) 285 11.8 UnityStandardInput.cginc的結構體、著色器變量、宏和函數(shù) 286 11.8.1 文件中預定義的宏 286 11.8.2 VertexInput結構體 287 11.8.3 TexCoords函數(shù) 287 11.8.4 DetailMask函數(shù) 288 11.8.5 Albedo函數(shù) 288 11.8.6 Alpha函數(shù) 289 11.8.7 Occlusion函數(shù) 289 11.8.8 MetallicGloss函數(shù) 289 11.8.9 Emission函數(shù) 290 11.8.10 NormalInTangentSpace函數(shù) 290 11.8.11 Parallax函數(shù) 291 11.9 UnityStandardUtils.cginc的結構體、著色器變量、宏和函數(shù) 292 11.9.1 PreMultiplyAlpha函數(shù) 292 11.9.2 OneMinusReflectivityFrom Metallic函數(shù) 292 11.9.3 DiffuseAndSpecularFrom Metallic函數(shù) 293 11.9.4 LerpWhiteTo函數(shù) 293 11.9.5 LerpOneTo函數(shù) 293 11.9.6 ParallaxOffset1Step函數(shù) 294 11.9.7 UnpackScaleNormalRGorAG函數(shù) 294 11.9.8 UnpackScaleNormal函數(shù) 295 11.9.9 BlendNormals函數(shù) 295 11.9.10 CreateTangentToWorldPer Vertex函數(shù) 295 11.9.11 ShadeSHPerVertex函數(shù) 295 11.9.12 ShadeSHPerPixel函數(shù) 296 11.9.13 BoxProjectedCubemap Direction函數(shù) 296 11.10 UnityImageBasedLighting.cginc的結構體、著色器變量、宏和函數(shù) 299 11.10.1 Unity_GlossyEnvironmentData結構體 299 11.10.2 UnityGlossyEnvironmentSetup 函數(shù) 300 11.10.3 Unity_GlossyEnvironment函數(shù) 300 11.10.4 perceptualRoughnessTo MipmapLevel函數(shù) 301 11.11 UnityGlobalIllumination.cginc的結構體、著色器變量、宏和函數(shù) 301 11.11.1 ResetUnityLight函數(shù) 301 11.11.2 SubtractMainLightWithReal timeAttenuationFromLightmap函數(shù) 302 11.11.3 UnityGI_Base函數(shù) 302 11.11.4 UnityGI_IndirectSpecular函數(shù) 304 11.11.5 UnityGlobalIllumination函數(shù)版本1 305 11.11.6 UnityGlobalIllumination函數(shù)版本2 305 11.12 UnityStandardBRDF.cginc的結構體、著色器變量、宏和函數(shù) 305 11.12.1 PerceptualRoughnessTo Roughness函數(shù) 306 11.12.2 RoughnessToPerceptual Roughness函數(shù) 306 11.12.3 SmoothnessToRoughness函數(shù) 306 11.12.4 SmoothnessToPerceptual Roughness函數(shù) 306 11.12.5 Pow4函數(shù)的4個不同版本 307 11.12.6 Pow5函數(shù)的4個不同版本 307 11.12.7 FresnelTerm函數(shù) 307 11.12.8 FresnelLerp函數(shù) 308 11.12.9 FresnelLerpFast函數(shù) 308 11.12.10 DisneyDiffuse函數(shù) 308 11.12.11 SmithJointGGXVisibilityTerm函數(shù) 309 11.12.12 GGXTerm函數(shù) 309 11.12.13 BRDF3_Indirect函數(shù) 310 11.12.14 BRDF3_Direct函數(shù) 310 11.12.15 BRDF3_Unity_PBS函數(shù) 311 11.12.16 BRDF2_Unity_PBS函數(shù) 311 11.12.17 BRDF1_Unity_PBS函數(shù) 313 11.13 UnityGBuffer.cginc的結構體、著色器變量、宏和函數(shù) 314 11.13.1 UnityStandardData結構體 314 11.13.2 UnityStandardDataToGbuffer函數(shù) 315 11.14 UnityMetaPass.cginc的結構體、著色器變量、宏和函數(shù) 315 11.14.1 UnityMetaPass常量緩沖區(qū) 315 11.14.2 UnityMetaInput結構體 315 11.14.3 UnityMetaVertexPosition函數(shù) 316 11.14.4 UnityMetaFragment函數(shù) 316 第 12章 實戰(zhàn)在片元著色器用算法實時繪制圖像 318 12.1 搭建繪圖環(huán)境 319 12.2 設計繪制場景的著色器 320 12.2.1 頂點著色器所需的數(shù)據(jù)結構和實現(xiàn) 320 12.2.2 判斷某點是否在三角形內(nèi) 321 12.2.3 基于距離場判定片元的顏色 322 12.2.4 定義五角星幾何體數(shù)據(jù) 326 12.2.5 判斷某點是否在圓及矩形內(nèi) 328 12.2.6 定義和繪制場景中的幾何體 331
你還可能感興趣
我要評論
|