關(guān)于我們
書(shū)單推薦
新書(shū)推薦
|
Unity 3D 內(nèi)建著色器源碼剖析
本書(shū)既是一本Unity 3D著色器代碼分析教程,也是一本Unity 3D著色器編程參考手冊(cè)。全書(shū)共12章,主要內(nèi)容包括:實(shí)時(shí)3D渲染流水線,輻射度、光度和色度學(xué)基本理論,Unity 3D著色器系統(tǒng),著色器工具函數(shù),Unity 3D引擎的多例化技術(shù),前向渲染和延遲渲染,Unity 3D的全局光照和陰影,UnityShadow Library.cginc文件分析,AutoLight.cginc文件分析,基于物理的光照模型,Unity 3D標(biāo)準(zhǔn)著色器和Standard. shader文件分析,片元著色器實(shí)時(shí)繪制圖像實(shí)戰(zhàn)案例。
本書(shū)適合Unity Shader的游戲開(kāi)發(fā)者、程序員閱讀,也可供相關(guān)專(zhuān)業(yè)人士參考。
第 一本Unity源碼分析的圖書(shū)
聯(lián)系輻射度學(xué)、光度學(xué)、色度學(xué)等物理理論,從物理學(xué)角度上闡述著色器所需要的基礎(chǔ)知識(shí)
剖析內(nèi)建著色器庫(kù)中的若干工具庫(kù)函數(shù),闡述清楚原理,讓讀者深入理解,能在開(kāi)發(fā)階段中有效使用
剖析內(nèi)建著色器庫(kù)中的標(biāo)準(zhǔn)材質(zhì),以及若干常用的著色器程序的實(shí)現(xiàn)原理,讓讀者能深入學(xué)習(xí)到當(dāng)前流行的渲染技術(shù)的實(shí)現(xiàn)原理,并融會(huì)貫通到實(shí)際開(kāi)發(fā)工作中
熊新科,資深游戲開(kāi)發(fā)工程師。2003年進(jìn)入游戲行業(yè),先后參與多項(xiàng)游戲的開(kāi)發(fā)。樂(lè)于分享技術(shù),活躍于各大Unity技術(shù)圈。
目 錄 第 1章 實(shí)時(shí)3D渲染流水線 1 1.1 概述 1 1.2 頂點(diǎn)處理階段 2 1.2.1 頂點(diǎn)的組織方式 2 1.2.2 坐標(biāo)系統(tǒng)和頂點(diǎn)法線的確定方式 3 1.2.3 把頂點(diǎn)從模型空間變換到世界空間 5 1.2.4 把頂點(diǎn)從世界空間變換到觀察空間 9 1.2.5 把頂點(diǎn)從觀察空間變換到裁剪空間 11 1.3 光柵化階段 18 1.3.1 裁剪操作 18 1.3.2 透視除法 18 1.3.3 背面剔除操作 19 1.3.4 視口變換 21 1.3.5 掃描轉(zhuǎn)換 22 1.4 片元處理與輸出合并階段 22 1.4.1 紋理操作 23 1.4.2 輸出合并中的深度值操作 24 1.4.3 輸出合并中的Alpha值操作 26 1.4.4 Unity 3D ShaderLab中的Alpha混合指令及深度測(cè)試指令 27 第 2章 輻射度、光度和色度學(xué)基本理論 30 2.1 輻射度學(xué)基本理論 30 2.1.1 立體角 32 2.1.2 點(diǎn)光源、輻射強(qiáng)度和輻射亮度 33 2.1.3 輻射出射度和輻射入射度 34 2.2 光度學(xué)基本理論 34 2.3 色度學(xué)基本理論 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 從一個(gè)外觀著色器程序談起 47 3.1.1 BasicDiffuse著色器展開(kāi)后的代碼分析 49 3.1.2 外觀著色器的編譯指示符 56 3.1.3 傳給外觀著色器函數(shù)的參數(shù) 58 3.2 直接編寫(xiě)頂點(diǎn)著色器和片元著色器 59 3.2.1 用Cg語(yǔ)言編寫(xiě)的包含著色器功能的代碼片段 59 3.2.2 聲明目標(biāo)渲染器 60 3.2.3 著色器的語(yǔ)義 61 3.3 在Cg代碼中訪問(wèn)著色器屬性塊 66 3.3.1 在著色器代碼中聲明材質(zhì)屬性 66 3.3.2 在著色器代碼中聲明對(duì)應(yīng)于材質(zhì)屬性的變量 67 3.4 使用著色器多樣體處理多種情況 67 3.4.1 編譯指示符multi_compile和shader_feature的使用方式與區(qū)別 67 3.4.2 多樣體關(guān)鍵字的使用限制 68 3.4.3 內(nèi)置的multi_compile指示符快捷使用方式 68 3.5 多平臺(tái)著色器代碼的支持 68 3.6 確定著色器編譯器的版本 69 3.6.1 和著色器編譯器版本相關(guān)的宏 69 3.6.2 消除著色器代碼中各平臺(tái)的語(yǔ)義差異性 70 3.6.3 關(guān)閉可忽視的編譯警告 72 3.6.4 Unity 3D Shader的基本數(shù)據(jù)類(lèi)型 72 3.6.5 消除平臺(tái)差異性 73 3.6.6 統(tǒng)一著色器常量緩沖區(qū)的宏定義 75 3.6.7 HLSL語(yǔ)言中的分支預(yù)測(cè)特性 75 第4章 引擎提供的著色器工具函數(shù)和數(shù)據(jù)結(jié)構(gòu) 78 4.1 UnityShaderVariables.cginc文件中的著色器常量和函數(shù) 78 4.1.1 進(jìn)行變換操作用的矩陣 78 4.1.2 和攝像機(jī)相關(guān)的常量緩沖區(qū) 81 4.1.3 與光照相關(guān)的工具函數(shù)和內(nèi)置光源 83 4.1.4 與陰影相關(guān)的著色器常量緩沖區(qū) 84 4.1.5 與逐幀繪制調(diào)用相關(guān)的著色器常量緩沖區(qū) 86 4.1.6 與霧效果相關(guān)的常量緩沖區(qū) 86 4.1.7 與光照貼圖相關(guān)的常量緩沖區(qū) 87 4.2 UnityCG.cginc文件中的工具函數(shù)和宏 90 4.2.1 數(shù)學(xué)常數(shù) 90 4.2.2 與顏色空間相關(guān)的常數(shù)和工具函數(shù) 90 4.2.3 描述頂點(diǎn)布局格式的結(jié)構(gòu)體 92 4.2.4 用于進(jìn)行空間變換的工具函數(shù) 93 4.2.5 與光照計(jì)算相關(guān)的工具函數(shù) 97 4.2.6 與HDR及光照貼圖顏色編解碼相關(guān)的工具函數(shù) 102 4.2.7 把高精度數(shù)據(jù)編碼到低精度緩沖區(qū)的函數(shù) 107 4.2.8 法線貼圖及其編解碼操作的函數(shù) 110 4.2.9 線性化深度值的工具函數(shù) 113 4.2.10 合并單程立體渲染時(shí)的左右眼圖像到一張紋理的函數(shù) 115 4.2.11 用來(lái)實(shí)現(xiàn)圖像效果的工具函數(shù)和預(yù)定義結(jié)構(gòu)體 117 4.2.12 計(jì)算屏幕坐標(biāo)的工具函數(shù) 118 4.2.13 與陰影處理相關(guān)的工具函數(shù) 121 4.2.14 與霧效果相關(guān)的工具函數(shù)和宏 123 第5章 Unity 3D引擎的多例化技術(shù) 128 5.1 多例化技術(shù)概述 128 5.1.1 不使用GPU多例化技術(shù)繪制多個(gè)相同模型的偽代碼 128 5.1.2 在Direct3D 11中設(shè)置輸入組裝階段的示例偽代碼 128 5.1.3 設(shè)置頂點(diǎn)輸入組裝布局 129 5.1.4 頂點(diǎn)著色器和片元著色器中對(duì)使用GPU多例化技術(shù)的對(duì)應(yīng)設(shè)置 129 5.2 如何在材質(zhì)中啟用多例化技術(shù) 130 5.3 添加逐實(shí)例數(shù)據(jù) 131 5.3.1 在外觀著色器中給材質(zhì)顏色變量增加GPU多例化支持的代碼 131 5.3.2 在C#層改變game object中的多例化材質(zhì)顏色屬性 132 5.4 在頂點(diǎn)著色器和片元著色器中使用多例化技術(shù) 132 5.4.1 在頂點(diǎn)著色器和片元著色器中啟用GPU多例化技術(shù) 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及另外兩個(gè)配套的宏的定義 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é)中展開(kāi)多例化相關(guān)的宏之后的代碼 137 第6章 前向渲染和延遲渲染 139 6.1 前向渲染概述 139 6.2 延遲渲染概述 139 6.3 Unity 3D中的各種渲染途徑 141 6.3.1 Unity 3D的前向渲染途徑細(xì)節(jié) 142 6.3.2 Unity 3D的延遲渲染途徑細(xì)節(jié) 144 第7章 Unity 3D的全局光照和陰影 147 7.1 全局照明和局部照明 147 7.2 引擎提供的光源類(lèi)型 149 7.2.1 點(diǎn)光源 149 7.2.2 聚光燈光源 150 7.2.3 有向平行光源 150 7.2.4 區(qū)域面光源 150 7.2.5 cookie 151 7.3 使用實(shí)時(shí)模式光源進(jìn)行全局照明 151 7.4 使用烘焙式光照貼圖進(jìn)行全局照明 152 7.5 使用混合光照進(jìn)行全局照明 153 7.5.1 Baked Indirect照明模式 154 7.5.2 Shadowmask照明模式 154 7.5.3 Subtractive照明模式 155 7.6 光探針照明的細(xì)節(jié) 156 7.6.1 光探針照明概述 156 7.6.2 在場(chǎng)景中布置光探針 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 正交對(duì)偶基函數(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)的關(guān)系 179 8.2 聚光燈光源生成的陰影 179 8.2.1 啟用SPOT宏 179 8.2.2 UNITY_DECLARE_SHADOWMAP宏的定義 180 8.2.3 SAMPLE_DEPTH_TEXTURE及類(lèi)似的宏 181 8.2.4 UnitySampleShadowmap函數(shù)版本1 182 8.2.5 UnitySampleShadowmap函數(shù)版本2 183 8.3 點(diǎn)光源生成的陰影 183 8.3.1 從立方體紋理貼圖中取得紋素對(duì)應(yīng)的深度值 183 8.3.2 對(duì)采樣值進(jìn)行混合計(jì)算 184 8.4 預(yù)烘焙的陰影 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 梯度計(jì)算 189 8.6 計(jì)算深度陰影的偏移值 190 8.6.1 UnityGetReceiverPlaneDepthBias函數(shù) 192 8.6.2 UnityCombineShadowcoordComponents函數(shù) 192 8.7 PCF陰影過(guò)濾的相關(guān)函數(shù) 193 8.7.1 UnitySampleShadowmap_PCF3x3NoHardwareSupport函數(shù) 194 8.7.2 用于進(jìn)行PCF過(guò)濾的輔助函數(shù) 195 8.7.3 執(zhí)行PCF過(guò)濾操作的函數(shù) 199 8.7.4 基于33內(nèi)核高斯模糊的PCF過(guò)濾操作 200 第9章 AutoLight.cginc文件分析 203 9.1 DIRECTIONAL宏的定義 203 9.2 有向平行光產(chǎn)生的基于屏幕空間的陰影的相關(guān)函數(shù) 203 9.2.1 啟用UNITY_NO_SCREENSPACE_SHADOWS宏時(shí)TRANSFER_SHADOW宏的定義 203 9.2.2 啟用UNITY_NO_SCREENSPACE_SHADOWS宏時(shí)的unitySampleShadow函數(shù) 204 9.2.3 未啟用UNITY_NO_SCREENSPACE_SHADOWS宏時(shí)TRANSFER_SHADOW宏的定義 204 9.2.4 UNITY_SAMPLE_SCREEN_SHADOW宏和UNITY_DECLARE_SCREENSPACE_ SHADOWMAP宏的定義 205 9.3 Unity 3D 5.6版本后的陰影和光照計(jì)算工具函數(shù) 205 9.3.1 UnityComputeForwardShadows函數(shù) 205 9.3.2 不同編譯條件下的UNITY_SHADOW_COORDS、UNITY_TRANSFER_SHADOW和UNITY_SHADOW_ATTENUATION宏的定義 206 9.3.3 計(jì)算點(diǎn)光源的光亮度衰減的宏 209 9.3.4 計(jì)算聚光燈光源的光亮度衰減的宏 209 9.3.5 計(jì)算有向平行光源的光亮度衰減的宏 211 9.3.6 計(jì)算帶cookie的點(diǎn)光源的光亮度衰減的宏 211 9.3.7 計(jì)算帶cookie的有向平行光源的光亮度衰減的宏 212 第 10章 基于物理的光照模型 213 10.1 漫反射和Lambert光照模型 213 10.2 鏡面反射和Phong光照模型 214 10.3 Blinn-Phong光照模型 215 10.4 基于物理的光照模型的相關(guān)概念 216 10.4.1 光的折射和折射率 216 10.4.2 均勻介質(zhì) 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標(biāo)準(zhǔn)著色器和 Standard.shader文件分析 227 11.1 標(biāo)準(zhǔn)著色器中的各項(xiàng)材質(zhì)屬性 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 第 一個(gè)SubShader的前向通路 238 11.3.1 前向通路的簡(jiǎn)化版頂點(diǎn)著色器入口函數(shù) 239 11.3.2 前向通路的簡(jiǎn)化版片元著色器入口函數(shù) 247 11.3.3 前向通路的簡(jiǎn)化版著色器流程 254 11.3.4 前向通路的標(biāo)準(zhǔn)版頂點(diǎn)著色器入口函數(shù) 255 11.3.5 前向通路的標(biāo)準(zhǔn)版片元著色器入口函數(shù) 258 11.3.6 前向通路的標(biāo)準(zhǔn)版著色器流程 263 11.4 第 一個(gè)SubShader的FORWARD_DELTA通路 263 11.4.1 FORWARD_DELTA通路的簡(jiǎn)化版頂點(diǎn)著色器入口函數(shù) 263 11.4.2 FORWARD_DELTA通路的簡(jiǎn)化版片元著色器入口函數(shù) 265 11.4.3 FORWARD_DELTA通路的簡(jiǎn)化版著色器流程 267 11.4.4 FORWARD_DELTA通路的標(biāo)準(zhǔn)版頂點(diǎn)著色器入口函數(shù) 268 11.4.5 FORWARD_DELTA通路的標(biāo)準(zhǔn)版片元著色器入口函數(shù) 270 11.4.6 FORWARD_DELTA通路的標(biāo)準(zhǔn)版著色器流程 271 11.5 第 一個(gè)SubShader的ShadowCaster通路 272 11.5.1 ShadowCaster通路的編譯指示符以及著色器變量和宏 273 11.5.2 ShadowCaster通路的頂點(diǎn)著色器入口函數(shù) 275 11.5.3 ShadowCaster通路的片元著色器入口函數(shù) 278 11.6 第 一個(gè)SubShader的延遲通路 281 11.6.1 延遲通路的頂點(diǎn)著色器入口函數(shù) 281 11.6.2 延遲通路的片元著色器入口函數(shù) 282 11.7 第 一個(gè)SubShader的元渲染通路 284 11.7.1 元渲染通路的頂點(diǎn)著色器入口函數(shù) 284 11.7.2 元渲染通路的片元著色器入口函數(shù) 285 11.8 UnityStandardInput.cginc的結(jié)構(gòu)體、著色器變量、宏和函數(shù) 286 11.8.1 文件中預(yù)定義的宏 286 11.8.2 VertexInput結(jié)構(gòu)體 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的結(jié)構(gòu)體、著色器變量、宏和函數(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的結(jié)構(gòu)體、著色器變量、宏和函數(shù) 299 11.10.1 Unity_GlossyEnvironmentData結(jié)構(gòu)體 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的結(jié)構(gòu)體、著色器變量、宏和函數(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的結(jié)構(gòu)體、著色器變量、宏和函數(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個(gè)不同版本 307 11.12.6 Pow5函數(shù)的4個(gè)不同版本 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的結(jié)構(gòu)體、著色器變量、宏和函數(shù) 314 11.13.1 UnityStandardData結(jié)構(gòu)體 314 11.13.2 UnityStandardDataToGbuffer函數(shù) 315 11.14 UnityMetaPass.cginc的結(jié)構(gòu)體、著色器變量、宏和函數(shù) 315 11.14.1 UnityMetaPass常量緩沖區(qū) 315 11.14.2 UnityMetaInput結(jié)構(gòu)體 315 11.14.3 UnityMetaVertexPosition函數(shù) 316 11.14.4 UnityMetaFragment函數(shù) 316 第 12章 實(shí)戰(zhàn)在片元著色器用算法實(shí)時(shí)繪制圖像 318 12.1 搭建繪圖環(huán)境 319 12.2 設(shè)計(jì)繪制場(chǎng)景的著色器 320 12.2.1 頂點(diǎn)著色器所需的數(shù)據(jù)結(jié)構(gòu)和實(shí)現(xiàn) 320 12.2.2 判斷某點(diǎn)是否在三角形內(nèi) 321 12.2.3 基于距離場(chǎng)判定片元的顏色 322 12.2.4 定義五角星幾何體數(shù)據(jù) 326 12.2.5 判斷某點(diǎn)是否在圓及矩形內(nèi) 328 12.2.6 定義和繪制場(chǎng)景中的幾何體 331
你還可能感興趣
我要評(píng)論
|