Unreal renders are held to the same show specification as every other department.
depth and mv are required AOVs, not optional extras.
Every shot and every cache carries 8 frames of handle, head and tail. The show
runs at true 24.000 fps — never 23.976; a 23.976 requirement is a
conform decision at delivery, never a production one. Full sheet:
Delivery Specs.
Content Folder Structure#
/Content/THS/ ├── Assets/ │ ├── _Global/ ← SHARED. Sorts first. Owned by the VFX Sup. │ │ ├── MasterMaterials/ ← every M_ on the show lives HERE and nowhere else │ │ ├── MaterialFunctions/ ← MF_ shared graph fragments │ │ ├── MaterialCollections/ ← MPC_ show-wide look controls │ │ ├── TextureLibrary/ ← tiling, trim, noise, utility — anything reusable │ │ ├── Decals/ HDRs/ IES/ ← lighting and surface libraries │ │ ├── OCIO/ ← the ACES 1.2 config asset │ │ └── LookDev/ Utility/ ← turntable rigs, debug and render helpers │ ├── Characters/<AssetName>/ ← CHR, CRT │ ├── Environments/<AssetName>/ ← ENV (incl. splats) │ ├── Buildings/<AssetName>/ ← BLD │ ├── Props/<AssetName>/ ← PRO │ ├── Weapons/<AssetName>/ ← WPN │ ├── Vehicles/<AssetName>/ ← VHC │ └── FX/<AssetName>/ ← FX ├── Sequences/ │ └── SEQ<NNN>/ │ └── sh<NNNN>/ ← level, level sequence, shot-local assets ├── Levels/ ← persistent + sublevels ├── Lookdev/ ← turntables, calibration, HDRI └── _Dev/ ← RnD and tests. NEVER referenced by a shipping shot.
Ask one question: if I delete this asset, should this texture die with it?
Yes → the asset's own Textures/ folder — a character's UDIM skin,
a hero prop's baked maps. No → Assets/_Global/TextureLibrary/ —
tiling, trim, decals, noise, utility. Shared across one modular set rather than the whole show? It lives
with the kit. Master materials are always _Global; an asset folder carries
its MI_ instances and never an M_.
Co-locating a texture does not duplicate it. Unreal assets reference each other by
package path, so one texture under Assets/Prp/Crate/Textures/ can be used by fifty materials
in fifty other folders. The duplication risk is real on Drive, where a file genuinely gets copied next to
each asset; it does not exist inside /Game. So the folder choice is about
lifecycle, Migrate, source-control locking and
redirectors — never about copies. Type-based layouts suit games and marketplace
packs, where almost everything is shared anyway; at series scale they lose on all four.
One folder per asset — PascalCase, no type prefix
AssetName from the production asset list. The parent folder carries the type — Characters/Scion/, not Characters/CHR_Scion/.Group by type inside each asset folder
Meshes/, Materials/, Textures/, Anim/. No other layout is acceptable inside an asset folder.Nothing outside /Content/THS/
_Dev/ referenced from Sequences/ = ERROR
_Dev/ reference from Sequences/ as a hard error that blocks publish, not a warning. _Dev/ is for RnD only and is never referenced by a shipping shot.Asset Naming#
AssetName as the name token. Format moves from broad to specific: what type, which asset, which detail, which variant.
Unreal Asset Prefix Table — 37 types
Meshes, Rigging & Simulation
Materials
MI_.M_.Textures
Animation
FX — Niagara
Levels, Sequencing & World
Data, Blueprints & Pipeline
THS_ never appears in Unreal — and why
Section 6.2 restricts THS_ to whole-document names and delivery masters only. The /Content/THS/ root folder is the project namespace; it is not a filename prefix. Any Unreal asset whose name contains THS_ is a QC error and will be renamed automatically. This is not negotiable — the show code belongs on documents, not assets.
PascalCase, descriptors, variants, and forbidden characters
- ▪AssetName is PascalCase and matches §6.5 exactly. The asset called
Scionon Drive isScionin Unreal. No abbreviations, no renaming at the border. - ▪Descriptors are PascalCase (
_Body,_Skin,_Interior). Variants are a trailing letter or two-digit number (_A,_01). - ×No spaces, no hyphens, no accents, no double underscores. Lowercase-only asset names are a QC error — Unreal names are PascalCase, unlike the lowercase file tokens in §6.1.
Materials & Textures#
Canonical map tokens — the same list used on disk, in Maya, and in Unreal
DIFF — Base colour / albedo
SSS — Subsurface scattering
NRM — Normal (OpenGL, green-up)
THICK — Thickness
MTL — Metallic
TRANSM — Transmission (glass)
RGH — Roughness
COAT — Clearcoat
DISP — Displacement
CAV — Cavity
AO — Ambient occlusion
EMI — Emissive
ORM — Packed AO / Roughness / Metallic
OPAC — Opacity / alpha
HGT — Height
MASK# — Numbered ID / utility mask
_BC, _N, _R, _M). We use one map vocabulary end to end so a texture is greppable across every DCC. QC enforces our tokens and auto-corrects the common aliases on import.ORM is expected and correct here
Packed AO(R) · Roughness(G) · Metallic(B). Unreal is where packed maps earn their keep. The channel map is: R = AO, G = Roughness, B = Metallic. For the Maya-side caveat and the decompose wiring, see scene-hierarchy.html.sRGB warning — data maps imported as sRGB silently corrupt all three channels
ORM and every other data map (NRM, RGH, MTL, AO, DISP, HGT, OPAC, CAV, MASK#) must be imported as non-colour — sRGB unchecked. An sRGB transform on packed data corrupts all three channels at once and is easy to miss by eye. QC enforces this as a hard error.
UDIM sets — single import, no tile number in the name
UDIM sets import as a single texture named without the tile number.T_Scion_Skin_DIFF covers all tiles — Unreal handles the tile expansion automatically.
M_ is a parent material. MI_ is what a mesh actually uses.
Assigning a raw M_ directly to a production mesh is a QC warning — it defeats instancing and makes a global change impossible. Always create an MI_ from the parent material and assign that.
Levels & Sequences#
SEQ010, sh0010. Unreal does not get its own shot numbering. A shot that is SEQ010_sh0010 on Drive is SEQ010_sh0010 here.
| Asset type | Pattern / Example | Notes |
|---|---|---|
| Level (shot) | L_SEQ010_sh0010 | One level per shot. Contains layout, characters, and all shot-local assets. |
| Level (persistent) | L_RustGorge_P | Always-loaded level per environment. Carries streaming config. |
| Sublevel | L_RustGorge_Lighting L_RustGorge_Set |
Streamed in by the persistent level. Suffix names the role. |
| Level Sequence | LS_SEQ010_sh0010 | Shot-level Sequencer track. Shot codes match Drive exactly. |
| Master Sequence | LS_SEQ010_Master | Container sequence for an entire sequence block. |
| Camera Actor | CAM_SEQ010_sh0010 | Virtual camera placed in the shot level. Not prefixed with L_ or LS_. |
LODs, Collision & Nanite#
Nanite is on by default
Non-Nanite meshes may carry LODs
LOD0…LOD3. No more than four levels.Collision is not required
What QC Must Reject#
Error Blocks Publish — 9 conditions
- Any asset outside
/Content/THS/referenced by a shot. Migrating content can break references — requires human decision before fix. - Any
_Dev/asset referenced fromSequences/. RnD material must never reach a shipping shot. - Missing or wrong type prefix — e.g.
Scioninstead ofSK_Scion. QC renames and fixes up redirectors. THS_appearing on any Unreal asset. Show code is restricted to documents and delivery masters per §6.2. QC stripsTHS_.- Asset name does not match any known production asset from the asset list. Either misnamed or not on the list — human must resolve.
- Spaces, hyphens, accents, or double underscores in an asset name. QC converts to PascalCase and strips separators.
- Texture using a non-canonical map token (e.g.
_BC,_N,_R). QC resolves via alias table before failing; unresolvable tokens block. - Sequence or shot code not matching the
SEQ<NNN>/sh<NNNN>pattern. Requires human correction — do not auto-rename. - Asset in the wrong type folder — e.g.
SK_ScionunderProps/. QC moves to the correct folder and updates redirectors.
Warning Flags for Review — 5 conditions
- Raw
M_assigned to a production mesh instead of anMI_. QC can create anMI_from the parent material and reassign automatically. - Hand-authored LODs on a Nanite mesh. QC can strip the hand LODs; confirm Nanite output looks correct before doing so.
- Collision authored on a mesh with no signed-off physics need. QC removes collision primitives on confirmation. This is a linear render, not a game.
- Empty asset folder. QC can delete the folder on confirmation that the asset is fully retired.
- Asset not referenced by any level or sequence (orphan). Human decides whether to keep, archive, or delete.