Skip to content

Built-in and URP shaders

Which properties a material stores, and what they mean, is decided by its shader. The shaders below are the ones the games use the most; each is described from its source (the built-in shader source for 2019.4.20f1, the Universal Render Pipeline source for the 6000.3 games). Sourced · Unity built-in shader source

SkateBIRD ships its built-in shaders as real Shader objects in sharedassets0.assets: Standard, Standard (Specular setup), Autodesk Interactive, the Legacy Shaders Bumped Diffuse, Bumped Specular, Transparent/Bumped Specular and Transparent/Cutout/Bumped Specular, Houdini/SpecularVertexColor, Shiny/Unlit Two Tone, Minimap/Mission Marker, Particles/Standard Unlit, and its own Bumped Specular Voronoi and Dirty Glass, plus the post-processing stack’s Hidden/PostProcessing/*. Observed · SkateBIRD

Sledding Game draws with the Universal Render Pipeline (Universal Render Pipeline/Lit, Unlit, Nature/SpeedTree7), FlatKit’s water shader, and shader-graph and package shaders (Shine Graph, BruteForce’s SnowIceURP). Inferred · Sledding

Output Computed from Confidence
base colour _BaseMap × _BaseColor Sourced · Universal Render Pipeline source
metallic, smoothness _Metallic and _Smoothness; with _METALLICSPECGLOSSMAP, the map’s R and its A × _Smoothness Sourced · Universal Render Pipeline source
occlusion the map’s G, lerped from white by _OcclusionStrength Sourced · Universal Render Pipeline source
normal _BumpMap × _BumpScale with _NORMALMAP Sourced · Universal Render Pipeline source
emission _EmissionColor × _EmissionMap with _EMISSION (an HDR colour can exceed 1) Sourced · Universal Render Pipeline source

URP’s vertex pass computes one coordinate, TRANSFORM_TEX(texcoord, _BaseMap), and the surface input samples the base, metallic, normal, occlusion and emission maps with it, so the other properties’ own tiling is never read. Detail maps are the one place a second transform applies. Sourced · Universal Render Pipeline source

Base colour is _MainTex × _Color; metallic _Metallic, smoothness _Glossiness; with _METALLICGLOSSMAP the map’s R replaces _Metallic and its A × _GlossMapScale gives smoothness; smoothness can come from the base map’s alpha (_SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A) with _GlossMapScale. Occlusion is the map’s G whenever the shader has one (Standard has no keyword for it), strength _OcclusionStrength. _BumpMap × _BumpScale with _NORMALMAP. Every map is sampled through _MainTex’s tiling (texcoord.xy = TRANSFORM_TEX(uv0, _MainTex)), the detail maps through _DetailAlbedoMap’s. Sourced · Unity built-in shader source The specular setup reads a specular colour and smoothness instead of metallic. Sourced · Unity built-in shader source

It is Standard’s core with RoughnessSetup (AutodeskInteractive.shader): the property _Glossiness is roughness, so smoothness is 1 − _Glossiness (MetallicRough, UnityStandardInput.cginc); with _METALLICGLOSSMAP the map’s R is metallic, and with _SPECGLOSSMAP the map’s R is the roughness. Sourced · Unity built-in shader source

A Legacy surface shader samples each map through its own tiling: a surface shader’s uv_<map> input is TRANSFORM_TEX(uv0, <map>). Base colour is _MainTex × _Color (alpha _MainTex’s × _Color’s), metallic is 0, and the normal map _BumpMap is unpacked unscaled (UnpackNormal). Sourced · Unity built-in shader source

Shader Lighting Notes Confidence
Bumped Specular, Transparent/Bumped Specular, Transparent/Cutout/Bumped Specular, Houdini/SpecularVertexColor UnityBlinnPhongLight: highlight _SpecColor × pow(n·h, 128 × _Shininess) × the gloss in _MainTex’s alpha the cut-out variant is alphatest:_Cutoff, the transparent one alpha:fade (SrcAlpha OneMinusSrcAlpha); the Houdini shader multiplies the vertex colour into the albedo and reads _LightColor0 at 32, _SpecColor at 48, _Color at 64, _Shininess at 80 of its constant buffer Sourced · Unity built-in shader source
Bumped Diffuse, Diffuse Lambert: diffuse only Diffuse has no normal map Sourced · Unity built-in shader source
Self-Illumin/Diffuse Lambert plus emission emission is _MainTex × _Color × _Illum’s alpha Sourced · Unity built-in shader source

Unlit/Color draws _Color as it is. Universal Render Pipeline/Unlit draws _BaseMap × _BaseColor. Sourced · Unity built-in shader source Universal Render Pipeline/Nature/SpeedTree7 draws _MainTex × _Color with wind, hue variation and alpha test; its geometry-type keywords (GEOM_TYPE_BRANCH, GEOM_TYPE_BRANCH_DETAIL) mark bark, and leaf, frond and mesh geometry stay vegetation. Sourced · Universal Render Pipeline source

Whether a shader multiplies the mesh’s vertex colour into its surface is a property of the shader, not the mesh. Observed

Takes the vertex colour Ignores it
Houdini/SpecularVertexColor; UI/Default; Sprites/Default; the Legacy and Mobile particle shaders; Particles/Standard Unlit and Surface; TextMesh Pro shaders (face colour × vertex colour) Standard, Standard (Specular setup), Autodesk Interactive, the legacy surface shaders, Unlit/Color, Unlit/Texture, URP Lit and Unlit

Both columns Sourced · Unity built-in shader source (the shaders’ input structs have or lack a COLOR input).

SkateBIRD’s compiled Houdini/SpecularVertexColor forward-base program (DXBC) multiplies _MainTex × _Color × COLOR0. Observed · SkateBIRD Meshes of the office level also carry non-white vertex colours under Standard and Legacy Bumped Diffuse materials, which those shaders do not read, so a mesh’s colours say nothing on their own about how it looks. Observed · SkateBIRD

A shader whose vertex program builds the shape from component data (Shapes’ line, disc, triangle and sphere shaders) draws a placeholder mesh; the shape is in the GameObject’s MonoBehaviours. SkateBIRD’s Minimap/Mission Marker is an interface shader on ordinary MeshRenderers (large spheres) that only the minimap camera draws, see layers and cameras. Observed · SkateBIRD

SkateBIRD’s own shader, read from its forward-base fragment program (one directional light, D3D11 ps_4_0) and its parameter record, is a Lambert surface (no specular term, whatever its name) whose _MainTex and _BumpMap are tiled stochastically. Observed · SkateBIRD Each map is sampled at the 3×3 cells around floor(uv) (uv the map’s own TRANSFORM_TEX coordinate); each cell c is offset by h = frac(sin(dot(c, (12.9898, 78.233))) × 43758.5453), weighted 2^(−7.2135 · |c − frac(uv) + h|²) and normalised. The albedo is that blend × _Color; the normal is the same blend of the unpacked normal map. The pattern never repeats. Observed · SkateBIRD