Shadow Warrior 2 and the Evolution of the Roadhog Engine”
Total Page:16
File Type:pdf, Size:1020Kb
„Shadow Warrior 2 and the evolution of the Roadhog Engine” Jarosław Pleskot Senior Engine Programmer Flying Wild Hog 2015 Presentation overview 1. Introduction 2. The engine evolution a) Level construction pipeline b) Character destruction 3. Foliage system 2.0 a) Architecture b) Storage c) Rendering Shadow Warrior vs Shadow Warrior Shadow Warrior Shadow Warrior 2 Production time 18 months total > 2 years Team size 35 50 Engine programmers 2 7 PC Platform differences* PC DX9 32 bit, ported to PC DX11, 64 bit only DX11 32/64 bit Multiplayer - COOP Renderer Light Pre-Pass, nonlinear Deffered, linear, PBR * both games run on PS4 and XONE, SW was ported to Mac and Linux externally The engine evolution Steps of the evolution 2011 2013 2014 2016 Shadow Warrior Shadow Warrior 2 Hard Reset Shadow Warrior (32/64 bit (64 bit DX11, PS4, (DX9, 32 bit) (DX9, 32 bit) DX11/PS4/XONE) XONE) • First version of • Foliage system • Renderer ported • Physically based Roadhog Engine • Mirror • New platforms rendering • Light pre-pass • Cutscenes • Extensive use of • Multiplayer renderer • Animation system job system • Procedural • Main + render extended character threads + a few • SSAO destruction worker threads • Skinned decals • Big change in (Havok, sound, • Job system level pipeline etc) introduced Level construction pipeline For all FWH games before Shadow Warrior 2 level geometry was constructed mainly outside game editor. • Hard reset: one big mesh + smaller meshes • Shadow Warrior: a few parts of a level (loaded or not) + smaller meshes + foliage • Game editor was simple, focused on gameplay design Level construction pipeline • Shadow Warrior 2 has randomized maps • Four levels of randomization: • large scale randomization: level blocks connected together with special parts (connectors) + background blocks • small scale randomization : ability to change/hide/show parts of a block • random interiors • random weather Level construction pipeline • Now level construction is done in the game editor • A lot of new features added including: • Terrain system(meshes creation+painting) • Geometry brush (simple meshes) • Wire modifier (static meshes deformation) • Scaling support Character destruction Hard Reset: • ragdoll breaking • swapping chunks • spawning character parts as static meshes • swapping textures „Hard Reset – Case Study”, Tomasz Baran, 2012 Character destruction Hard Reset: + fast + low memory cost - limited to noncontinues meshes (robots) - predefined places of destruction Character destruction Shadow Warrior: • ragdoll breaking with skinned mesh cloning • character is made of parts (standard, gore, skeleton) • spawning character parts as static meshes • skinned decals Character destruction Shadow Warrior: + excellent quality of meshes + low CPU time cost - a lot of work for character artists - predefined places of cuts Character destruction Shadow Warrior 2: • real-time procedural character splitting (mesh+ragdoll) • holes • spawning parts as static meshes • material modifiers • skinned decals YOUTUBE: Shadow Warrior 2 - 15 Glorious Minutes of Gameplay [E3 2015] Character destruction Shadow Warrior 2: + unique cuts + less work for artists - more memory, splitting time - some constraints for artists Still under development look for future presentations for details Foliage system 2.0 Foliage system before SW2 • Levels in Shadow Warrior created in 3dsmax • Spawn meshes technique invented * Spawn meshes – meshes with relative foliage density stored as vertex color * „The Techonology behind Shadow Warrior”, Jarosław Pleskot, 2014 Foliage system 2.0 – requirements • Denser foliage Use (spatially) bigger meshes and reduce an instance size to lower the gather time • Levels created in game editor • Random level generation (level blocks, predefined parts of a block changed) Must reinvent the foliage system! Foliage system 2.0 – architecture • Main classes: • Foliage Area • Foliage Layer • Foliage Palette • Foliage Set • Foliage Element Foliage system 2.0 – layers • Foliage layer - contains instance transformations in local space • One Foliage Layer per gameobject with foliage painted • Objects can be moved, rotated, scaled in editor, foliage will be updated properly Foliage Area Foliage Layer „A” Foliage Layer „B” … Foliage Layer „N” Foliage system 2.0 – layers • On level start we build foliage grid using foliage layers of all created objects (random levels) Foliage Area Foliage Layer „A” Foliage Layer „B” … Foliage Layer „N” World Placeable „A” … Placeable „N” Placeable „B” Foliage system 2.0 – layers • A foliage layer stores full FP32 positions and FP16 normals together with coloring values, set ids and seeds for a random number generator • Foliage can be blocked in some areas using foliage blockers (eg. don’t want foliage under a randomly placed fountain) • 100-200 layers per level block used • Artist can change brush parameters without repainting the layer Foliage system 2.0 – palette • Painting using Foliage Set (Brush) • One set can contain many elements • Each element can specify many meshes and painting properties for all meshes in the element Foliage Palette Foliage Set „A” Foliage Set „N” Foliage Element 1 … Foliage Element 1 … … Foliage Element N Foliage Element N Foliage system 2.0 – palette editor Foliage system 2.0 – painting • Density counted for every set individually • Can erase instances of a single set or all of them at once • Painting on translucents as an option (e.g. over/under water) • Angle limit (eg. painting the stairs) Foliage system 2.0 – coloring • Constant or background color mode • Can randomize color in HSL space • Can blend out coloring using object space Z coord and multiplier Foliage system 2.0 – grids • Multi resolution grids (2 levels: 4x4 and 64x64 meters, one grid per batch) in Shadow Warrior DX11 Foliage system 2.0 – storage (grid) • Now more batches used and visibility test used for foliage (software Z buffer visibility) • One grid per batch changed to one grid for all batches to reduce grid total traverse time and to evade redundant visibility tests Foliage system 2.0 – storage Instance size reduced from 32 to 16 bytes struct SObject struct SObject { { Half4 m_plane0; // 8 Half4 m_euler; // 8 Half4 m_plane1; // 16 Int16 m_worldZ; // 10 Half4 m_plane2; // 24 UInt8 m_localX; // 11 Vec3Packed64 m_position;// 32 UInt8 m_localY; // 12 }; UInt32 m_coloring; // 16 }; Foliage system 2.0 – storage struct SObject { Half4 m_euler; // 8 Int16 m_worldZ; // 10 UInt8 m_localX; // 11 UInt8 m_localY; // 12 UInt32 m_coloring; // 16 }; • Rotation stored as FP16 euler angles • XY position relative to node corner • Z in worldspace • Position resolution ~1,6 cm, min/max Z = ±512 m • Size generated at runtime • Batch and LoD index in m_euler.W Foliage system 2.0 – imposters Imposter system was created for static meshes • Diffuse + normal maps • Many angles Adopted for the foliage system: • Yaw only rotation • Sharpening • Background color Foliage system 2.0 – imposters • Enabled by default • From 1 to 16 angles, default 4 • 3 texture sizes, default 128 (size == bigger dimension of single image, power of 2) • Range ratio, default 0.5 (?) • Generation background color • Sharpening option Foliage system 2.0 – imposters Level of detail: imposters, 20 % • 3 stages for high and ultra setting, imposters, 100 % • 2 stages for low setting (20% of meshes 100 % instances) • Dissolve between stages Foliage system 2.0 – imposters OFF Foliage system 2.0 – imposters ON Foliage system 2.0 – terrain • Foliage is usually placed on the terrain • Editing the terrain must update the foliage • When painting we get positions and normals from g-buffer • When updating terrain they are recaluclated from heightmap Foliage system 2.0 – backend •OFFTraversing grid and gathering data for a renderer using one separate job, many arrays of vertices copied to a single dynamic VB / passed to imposter system • Rendering: - main G-Buffer pass - directional shadowmap pass - ids for picking, editor only Foliage system 2.0 – to do list • Coloring on imposters • Dedicated instancing vertex format • Reaction to the passing characters ? Movies 1. https://youtu.be/hFz5OAVFSC8 2. https://youtu.be/SkEJ7ox2c8w Acknowledgment Łukasz Zdunowski – Lead Artist Zbigniew Siatecki – Senior Environment Artist Marcin Sapiejewski – Senior Environment Artist Przemysław Witkowski – 3D/Engine Programmer Artur Maksara - Producer + our entire team and GIC staff. Thank you for your attention Questions? Contact: Email: jarek.pleskot AT flyingwildhog.com Twitter: @JaroslawPleskot Facebook: Jarosław Pleskot .