记录Unity的标准着色器实现,基于Unity 2017.1版本的代码进行分析。
Standard Shader
文件位于\DefaultResourcesExtra\Standard.shader
1 // Unity built-in shader source. Copyright (c) 2016 Unity Technologies. MIT license (see license.txt) 2 3 Shader "Standard" 4 { 5 Properties 6 { 7 _Color("Color", Color) = (1,1,1,1) 8 _MainTex("Albedo", 2D) = "white" {} 9 10 _Cutoff("Alpha Cutoff", Range(0.0, 1.0)) = 0.5 11 12 _Glossiness("Smoothness", Range(0.0, 1.0)) = 0.5 13 _GlossMapScale("Smoothness Scale", Range(0.0, 1.0)) = 1.0 14 [Enum(Metallic Alpha,0,Albedo Alpha,1)] _SmoothnessTextureChannel ("Smoothness texture channel", Float) = 0 15 16 [Gamma] _Metallic("Metallic", Range(0.0, 1.0)) = 0.0 17 _MetallicGlossMap("Metallic", 2D) = "white" {} 18 19 [ToggleOff] _SpecularHighlights("Specular Highlights", Float) = 1.0 20 [ToggleOff] _GlossyReflections("Glossy Reflections", Float) = 1.0 21 22 _BumpScale("Scale", Float) = 1.0 23 _BumpMap("Normal Map", 2D) = "bump" {} 24 25 _Parallax ("Height Scale", Range (0.005, 0.08)) = 0.02 26 _ParallaxMap ("Height Map", 2D) = "black" {} 27 28 _OcclusionStrength("Strength", Range(0.0, 1.0)) = 1.0 29 _OcclusionMap("Occlusion", 2D) = "white" {} 30 31 _EmissionColor("Color", Color) = (0,0,0) 32 _EmissionMap("Emission", 2D) = "white" {} 33 34 _DetailMask("Detail Mask", 2D) = "white" {} 35 36 _DetailAlbedoMap("Detail Albedo x2", 2D) = "grey" {} 37 _DetailNormalMapScale("Scale", Float) = 1.0 38 _DetailNormalMap("Normal Map", 2D) = "bump" {} 39 40 [Enum(UV0,0,UV1,1)] _UVSec ("UV Set for secondary textures", Float) = 0 41 42 43 // Blending state 44 [HideInInspector] _Mode ("__mode", Float) = 0.0 45 [HideInInspector] _SrcBlend ("__src", Float) = 1.0 46 [HideInInspector] _DstBlend ("__dst", Float) = 0.0 47 [HideInInspector] _ZWrite ("__zw", Float) = 1.0 48 } 49 50 CGINCLUDE 51 #define UNITY_SETUP_BRDF_INPUT MetallicSetup 52 ENDCG 53 54 SubShader 55 { 56 Tags { "RenderType"="Opaque" "PerformanceChecks"="False" } 57 LOD 300 58 59 60 // ------------------------------------------------------------------ 61 // Base forward pass (directional light, emission, lightmaps, ...) 62 Pass 63 { 64 Name "FORWARD" 65 Tags { "LightMode" = "ForwardBase" } 66 67 Blend [_SrcBlend] [_DstBlend] 68 ZWrite [_ZWrite] 69 70 CGPROGRAM 71 #pragma target 3.0 72 73 // ------------------------------------- 74 75 #pragma shader_feature _NORMALMAP 76 #pragma shader_feature _ _ALPHATEST_ON _ALPHABLEND_ON _ALPHAPREMULTIPLY_ON 77 #pragma shader_feature _EMISSION 78 #pragma shader_feature _METALLICGLOSSMAP 79 #pragma shader_feature ___ _DETAIL_MULX2 80 #pragma shader_feature _ _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A 81 #pragma shader_feature _ _SPECULARHIGHLIGHTS_OFF 82 #pragma shader_feature _ _GLOSSYREFLECTIONS_OFF 83 #pragma shader_feature _PARALLAXMAP 84 85 #pragma multi_compile_fwdbase 86 #pragma multi_compile_fog 87 #pragma multi_compile_instancing 88 // Uncomment the following line to enable dithering LOD crossfade. Note: there are more in the file to uncomment for other passes. 89 //#pragma multi_compile _ LOD_FADE_CROSSFADE 90 91 #pragma vertex vertBase 92 #pragma fragment fragBase 93 #include "UnityStandardCoreForward.cginc" 94 95 ENDCG 96 } 97 // ------------------------------------------------------------------ 98 // Additive forward pass (one light per pass) 99 Pass 100 { 101 Name "FORWARD_DELTA" 102 Tags { "LightMode" = "ForwardAdd" } 103 Blend [_SrcBlend] One 104 Fog { Color (0,0,0,0) } // in additive pass fog should be black 105 ZWrite Off 106 ZTest LEqual 107 108 CGPROGRAM 109 #pragma target 3.0 110 111 // ------------------------------------- 112 113 114 #pragma shader_feature _NORMALMAP 115 #pragma shader_feature _ _ALPHATEST_ON _ALPHABLEND_ON _ALPHAPREMULTIPLY_ON 116 #pragma shader_feature _METALLICGLOSSMAP 117 #pragma shader_feature _ _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A 118 #pragma shader_feature _ _SPECULARHIGHLIGHTS_OFF 119 #pragma shader_feature ___ _DETAIL_MULX2 120 #pragma shader_feature _PARALLAXMAP 121 122 #pragma multi_compile_fwdadd_fullshadows 123 #pragma multi_compile_fog 124 // Uncomment the following line to enable dithering LOD crossfade. Note: there are more in the file to uncomment for other passes. 125 //#pragma multi_compile _ LOD_FADE_CROSSFADE 126 127 #pragma vertex vertAdd 128 #pragma fragment fragAdd 129 #include "UnityStandardCoreForward.cginc" 130 131 ENDCG 132 } 133 // ------------------------------------------------------------------ 134 // Shadow rendering pass 135 Pass { 136 Name "ShadowCaster" 137 Tags { "LightMode" = "ShadowCaster" } 138 139 ZWrite On ZTest LEqual 140 141 CGPROGRAM 142 #pragma target 3.0 143 144 // ------------------------------------- 145 146 147 #pragma shader_feature _ _ALPHATEST_ON _ALPHABLEND_ON _ALPHAPREMULTIPLY_ON 148 #pragma shader_feature _METALLICGLOSSMAP 149 #pragma shader_feature _PARALLAXMAP 150 #pragma multi_compile_shadowcaster 151 #pragma multi_compile_instancing 152 // Uncomment the following line to enable dithering LOD crossfade. Note: there are more in the file to uncomment for other passes. 153 //#pragma multi_compile _ LOD_FADE_CROSSFADE 154 155 #pragma vertex vertShadowCaster 156 #pragma fragment fragShadowCaster 157 158 #include "UnityStandardShadow.cginc" 159 160 ENDCG 161 } 162 // ------------------------------------------------------------------ 163 // Deferred pass 164 Pass 165 { 166 Name "DEFERRED" 167 Tags { "LightMode" = "Deferred" } 168 169 CGPROGRAM 170 #pragma target 3.0 171 #pragma exclude_renderers nomrt 172 173 174 // ------------------------------------- 175 176 #pragma shader_feature _NORMALMAP 177 #pragma shader_feature _ _ALPHATEST_ON _ALPHABLEND_ON _ALPHAPREMULTIPLY_ON 178 #pragma shader_feature _EMISSION 179 #pragma shader_feature _METALLICGLOSSMAP 180 #pragma shader_feature _ _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A 181 #pragma shader_feature _ _SPECULARHIGHLIGHTS_OFF 182 #pragma shader_feature ___ _DETAIL_MULX2 183 #pragma shader_feature _PARALLAXMAP 184 185 #pragma multi_compile_prepassfinal 186 #pragma multi_compile_instancing 187 // Uncomment the following line to enable dithering LOD crossfade. Note: there are more in the file to uncomment for other passes. 188 //#pragma multi_compile _ LOD_FADE_CROSSFADE 189 190 #pragma vertex vertDeferred 191 #pragma fragment fragDeferred 192 193 #include "UnityStandardCore.cginc" 194 195 ENDCG 196 } 197 198 // ------------------------------------------------------------------ 199 // Extracts information for lightmapping, GI (emission, albedo, ...) 200 // This pass it not used during regular rendering. 201 Pass 202 { 203 Name "META" 204 Tags { "LightMode"="Meta" } 205 206 Cull Off 207 208 CGPROGRAM 209 #pragma vertex vert_meta 210 #pragma fragment frag_meta 211 212 #pragma shader_feature _EMISSION 213 #pragma shader_feature _METALLICGLOSSMAP 214 #pragma shader_feature _ _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A 215 #pragma shader_feature ___ _DETAIL_MULX2 216 #pragma shader_feature EDITOR_VISUALIZATION 217 218 #include "UnityStandardMeta.cginc" 219 ENDCG 220 } 221 } 222 223 SubShader 224 { 225 Tags { "RenderType"="Opaque" "PerformanceChecks"="False" } 226 LOD 150 227 228 // ------------------------------------------------------------------ 229 // Base forward pass (directional light, emission, lightmaps, ...) 230 Pass 231 { 232 Name "FORWARD" 233 Tags { "LightMode" = "ForwardBase" } 234 235 Blend [_SrcBlend] [_DstBlend] 236 ZWrite [_ZWrite] 237 238 CGPROGRAM 239 #pragma target 2.0 240 241 #pragma shader_feature _NORMALMAP 242 #pragma shader_feature _ _ALPHATEST_ON _ALPHABLEND_ON _ALPHAPREMULTIPLY_ON 243 #pragma shader_feature _EMISSION 244 #pragma shader_feature _METALLICGLOSSMAP 245 #pragma shader_feature _ _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A 246 #pragma shader_feature _ _SPECULARHIGHLIGHTS_OFF 247 #pragma shader_feature _ _GLOSSYREFLECTIONS_OFF 248 // SM2.0: NOT SUPPORTED shader_feature ___ _DETAIL_MULX2 249 // SM2.0: NOT SUPPORTED shader_feature _PARALLAXMAP 250 251 #pragma skip_variants SHADOWS_SOFT DIRLIGHTMAP_COMBINED 252 253 #pragma multi_compile_fwdbase 254 #pragma multi_compile_fog 255 256 #pragma vertex vertBase 257 #pragma fragment fragBase 258 #include "UnityStandardCoreForward.cginc" 259 260 ENDCG 261 } 262 // ------------------------------------------------------------------ 263 // Additive forward pass (one light per pass) 264 Pass 265 { 266 Name "FORWARD_DELTA" 267 Tags { "LightMode" = "ForwardAdd" } 268 Blend [_SrcBlend] One 269 Fog { Color (0,0,0,0) } // in additive pass fog should be black 270 ZWrite Off 271 ZTest LEqual 272 273 CGPROGRAM 274 #pragma target 2.0 275 276 #pragma shader_feature _NORMALMAP 277 #pragma shader_feature _ _ALPHATEST_ON _ALPHABLEND_ON _ALPHAPREMULTIPLY_ON 278 #pragma shader_feature _METALLICGLOSSMAP 279 #pragma shader_feature _ _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A 280 #pragma shader_feature _ _SPECULARHIGHLIGHTS_OFF 281 #pragma shader_feature ___ _DETAIL_MULX2 282 // SM2.0: NOT SUPPORTED shader_feature _PARALLAXMAP 283 #pragma skip_variants SHADOWS_SOFT 284 285 #pragma multi_compile_fwdadd_fullshadows 286 #pragma multi_compile_fog 287 288 #pragma vertex vertAdd 289 #pragma fragment fragAdd 290 #include "UnityStandardCoreForward.cginc" 291 292 ENDCG 293 } 294 // ------------------------------------------------------------------ 295 // Shadow rendering pass 296 Pass { 297 Name "ShadowCaster" 298 Tags { "LightMode" = "ShadowCaster" } 299 300 ZWrite On ZTest LEqual 301 302 CGPROGRAM 303 #pragma target 2.0 304 305 #pragma shader_feature _ _ALPHATEST_ON _ALPHABLEND_ON _ALPHAPREMULTIPLY_ON 306 #pragma shader_feature _METALLICGLOSSMAP 307 #pragma skip_variants SHADOWS_SOFT 308 #pragma multi_compile_shadowcaster 309 310 #pragma vertex vertShadowCaster 311 #pragma fragment fragShadowCaster 312 313 #include "UnityStandardShadow.cginc" 314 315 ENDCG 316 } 317 318 // ------------------------------------------------------------------ 319 // Extracts information for lightmapping, GI (emission, albedo, ...) 320 // This pass it not used during regular rendering. 321 Pass 322 { 323 Name "META" 324 Tags { "LightMode"="Meta" } 325 326 Cull Off 327 328 CGPROGRAM 329 #pragma vertex vert_meta 330 #pragma fragment frag_meta 331 332 #pragma shader_feature _EMISSION 333 #pragma shader_feature _METALLICGLOSSMAP 334 #pragma shader_feature _ _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A 335 #pragma shader_feature ___ _DETAIL_MULX2 336 #pragma shader_feature EDITOR_VISUALIZATION 337 338 #include "UnityStandardMeta.cginc" 339 ENDCG 340 } 341 } 342 343 344 FallBack "VertexLit" 345 CustomEditor "StandardShaderGUI" 346 }