Optimalizace 3D modelů pro herní a webové aplikace

Proč optimalizovat 3D modely pro hry a web

Optimalizace 3D modelů je klíčovým předpokladem pro dosažení stabilního snímkového kmitočtu, nízké latence a rychlého načítání v prostředí herních enginů i webových prohlížečů. Ovlivňuje využití CPU/GPU, velikost přenášených dat, počet draw callů, paměťovou stopu i kvalitu vizuální věrnosti. Cílem je vyvážit vizuální detail s rozpočty na polygony, textury, materiály, animace a síťový přenos – a to s ohledem na cílové platformy (mobil, konzole, PC, web).

Výkonnostní a paměťové rozpočty

  • Rozpočet polygonů: stanovte cílový počet trojúhelníků na scénu i na objekt (např. mobil 1–3 M tris na scénu, PC 5–15 M podle žánru). Zohledněte také počet vrcholů po dělení podle UV švů a tvrdých hran.
  • Paměť textur: sledujte využití VRAM/RAM včetně mipmap; preferujte komprimované formáty a rozumné rozlišení odpovídající texel density.
  • Draw calls: slučujte materiály a využijte instancing; každý unikátní materiál a mesh může přidat další vykreslovací volání.
  • Šířka pásma: pro web optimalizujte velikost GLB/GLTF souborů, používejte kompresi a HTTP caching.

Topologie, trojúhelníky a hustota sítě

  • Čistá topologie: vyhýbejte se n-gonům a zbytečným trojúhelníkům; u organických tvarů udržujte plynulé směrnice hran, u hard-surface objektů dbejte na konzistentní zaoblení hran (chamfer).
  • Edge flow: směrujte topologii podle křivosti a animovaných partií (kolena, lokty); tím předejdete artefaktům skinningu a nežádoucí kompresi normal map.
  • Decimace: používejte adaptivní redukci sítě s metrikou chyby a ochranou hran (feature preservation).

Level of Detail (LOD), HLOD a impostory

  • LOD řady: připravte 3–5 úrovní; LOD0 pro blízký pohled, LOD1–3 pro vzdálenější záběry. Každý LOD redukuje počet trojúhelníků o 40–70 % oproti předchozímu.
  • Křížové prolínání: použijte cross-fade nebo dithering pro plynulé a neviditelné přepínání mezi LODy.
  • Impostory/billboardy: u velmi vzdálených objektů a vegetace využijte obrazové impostory nebo 2D billboardy s normal mapou.
  • HLOD: hierarchická agregace vzdálených skupin objektů do jednoho zjednodušeného meše, což výrazně snižuje počet draw callů.

UV mapování, švy a texel density

  • UV švy a tvrdé hrany: tvrdá hrana obvykle vyžaduje UV šev; minimalizujte jejich počet a zajistěte dostatečný padding (typicky ≥ 4–16 px v 1× mipmapě).
  • Texel density: sjednoťte hustotu (např. 512–1024 px/m) pro konzistentní ostrost. Měřte a škálujte UV tak, aby klíčové plochy měly přednost.
  • Překryvy: povoleny jsou pro tile textury a symetrické části, ale nesmí se překrývat v UV2, které je určeno pro lightmapy.
  • Atlasování: slučujte drobné prvky do atlasů za účelem snížení draw callů, avšak dejte pozor na bleeding a artefakty mipmap.

PBR materiály: minimalizace variant a správná kalibrace

  • Fyzikálně korektní workflow: baseColor, metallic, roughness, normal, occlusion, emissive. Udržujte lineární barevný prostor a správné gama korekce.
  • Sloučení textur: pro web používejte masky v kanálech (např. ORM: occlusion–roughness–metallic v RGB) ke snížení počtu souborů.
  • Varianty shaderů: omezte počet materiálů a shader feature flagů, protože jejich nárůst zvyšuje počet kompilací a draw callů.

Textury: formáty, komprese a mipmapy

  • Komprese GPU: BC/ASTC/ETC dle platformy; pro web preferujte KTX2 s Basis Universal, který se transkoduje do nativních GPU formátů.
  • Mipmapping: vždy aktivujte mipmapy pro snížení aliasingu a zatížení; nastavte anisotropní filtrování pro šikmé plochy.
  • Rozlišení: vycházejte z texel density a vzdálenosti kamery; často stačí 1–2K textury místo 4K, pokud je objekt v záběru malý.
  • Draco/meshopt: pro geometrii v glTF používejte KHR_draco_mesh_compression nebo EXT_meshopt_compression; pro textury pak KTX2/Basis.

Normal mapy, smoothing groups a správná orientace

  • Smoothing: tvrdé hrany na ostrých přechodech, jinde plynulé; kompozice musí odpovídat zvolenému bake profilu.
  • OpenGL vs. DirectX normal mapy: zelený kanál může být invertovaný; pro web (WebGL/Three.js) se zpravidla používá OpenGL konvence. Zkontrolujte při exportu.
  • Tangent space: zajistěte konzistentní generování tangents a bitangents mezi použitém nástrojem a enginem; nesoulad způsobí viditelné švy a vlnění.

Baking detailů: AO, curvature, thickness a detailní normal

  • High-to-low bake: přeneste detaily z highpoly modelu do normal a curvature map; zajistí věrnost i při nízkém polycountu.
  • Ambient Occlusion: používejte jemně a násobně (multiplikativně), vyvarujte se přepálení; pro web preferujte AO v ORM masce.
  • Detailní normal mapy: kombinujte střední frekvenci (baked) s detail normal (tile) pro blízké záběry.

Skeletální animace a morph targets

  • Skinning limity: držte maximálně 4 kosti na jeden vrchol; omezte celkový počet kostí kvůli limitům uniform bufferů (zejména web a mobil).
  • Morph targets (blendshapes): výrazně zvyšují velikost dat; používejte je selektivně a s kvantizací či kompresí.
  • Kompresní techniky animací: redukce klíčových snímků, kvantizace rotací (např. quaternion 10–14 bitů), spline aproximace; při runtime dekompresi volte knihovny s nízkou režijní záteží.

Fyzika, kolizní proxy a navigace

  • Kolizní meše: nahrazujte vizuální mesh jednoduššími tvary (box, kapsle, konvexní obal). Vyhněte se zbytečně složité fyzice s trojúhelníkovou sítí.
  • NavMesh: generujte samostatně a udržujte mimo vizuální GLTF; optimalizujte velikost a přesnost podle potřeb AI.

Slučování, instancing a draw calls

  • Batching: slučujte statické části se stejným materiálem; ale pozor na frustum culling – příliš velké batche mohou zbytečně vykreslovat neviditelné objekty.
  • Instancing: pro opakující se objekty (stromy, šrouby) používejte hardwarový instancing; atributy pro varianty (barva, transformace) ukládejte jako instanced buffery.
  • Materiálová disciplína: minimalizujte počet materiálů; slučujte drobné textury do atlasů.

Formáty a export: glTF/GLB jako standard

  • glTF 2.0/GLB: preferovaný formát pro web i enginy díky podpoře PBR, binárnímu balení a rozšířením (KHR_*).
  • Rozšíření glTF: KHR_materials_unlit, transmission, sheen, clearcoat, ior, specular, KHR_lights_punctual, KHR_texture_basisu, KHR_mesh_quantization, KHR_draco_mesh_compression, EXT_meshopt_compression.
  • FBX/OBJ → glTF: při konverzi kontrolujte jednotky, osu nahoru (Y/Z), handedness a pivoty; zamrzněte transformace a aplikujte škálování 1.0.

Jednotky, osy, pivoty a transformace

  • Metrické jednotky: standardizujte na metry (1.0 = 1 m) pro konzistentní fyziku a osvětlení.
  • Osy a handedness: webové scény obvykle používají Y-up, pravotočivý systém; sjednoťte nastavení v DCC nástroji.
  • Pivot a freeze: nastavte pivot do smysluplného místa (pant dveří, střed otáčení kola) a freeze transforms před exportem.

Web specifika: WebGL/WebGPU, Three.js/Babylon.js

  • Načítání: používejte GLTFLoader/AssetContainer, BasisTextureLoader a paralelní načítání přes HTTP/2.
  • Kompresní pipeline: exportujte GLB, používejte Draco/meshopt pro geometrii, KTX2/Basis pro textury, gzip/brotli na transportní vrstvě.
  • Cache-Control: nastavte dlouhé max-age pro verzované assety; používejte content hashing v názvech souborů.
  • Streaming/progressive loading: začněte s LOD nebo proxy modelem, pak načítejte detaily; zobrazte skeleton UI (skeleton screen) pro lepší uživatelský dojem.

Osvětlení, lightmapy a stínování

  • Lightmap UV2: bez překryvů a s paddingem; na webu preferujte menší atlas s opatrnou volbou rozlišení a komprese.
  • Stíny: vyvažte kvalitu a výkon (PCF, filtr, rozlišení shadow mapy); statické stíny bakeujte, dynamické ponechejte tam, kde jsou opravdu potřeba.
  • Environment mapy: předfiltrujte (specular/irradiance), komprimujte do KTX2; správné IBL výrazně zvyšuje vizuální kvalitu při minimální zátěži.

Kvalita obrazu: color management a tónové mapování

  • Lineární workflow: pracujte v lineárním barevném prostoru, gamma korekce až na finálním výstupu; správně nastavte tagování sRGB u textur.
  • Tone mapping: používejte Reinhard nebo ACES podle cílové platformy; zachovejte konzistenci mezi DCC nástrojem a enginem.

Automatizace a nástroje pro optimalizaci

  • Automatická decimace a LOD: využívejte nástroje s chybovou metrikou a ochranou hran; po redukci validujte normály a UV.
  • Kompresní CLI: glTF-Transform, Blender add-ony, meshoptimizer CLI, toKtx2/BasisU pipeline.
  • Kontrola kvality: testujte překryvy UV, texel density, degenerate trojúhelníky, non-manifold hrany a chybějící tangenty.

Časté chyby a jak se jim vyhnout

  • Nepřiměřené rozlišení textur na malých objektech – udržujte vhodnou texel density.
  • Chybné UV pro lightmapy (překryvy, malý padding) – proveďte re-unwrap a validaci bake testem.
  • Směs konvencí normal map (GL vs. DX) – sjednoťte a invertujte zelený kanál podle cílové pipeline.
  • Excesivní počet materiálů – použijte atlasování a sdílené materiály, konsolidujte ORM masky.
  • Chybějící LOD a impostory – implementujte automatizovaný LOD chain.
  • Příliš složité kolizní objemy – nahraďte jednoduchými konvexními tvary.

Doporučený pipeline postup

  1. Modelujte s čistou topologií a rozumným polycountem, používejte metrické jednotky.
  2. Proveďte UV unwrap s jednotnou texel density; UV2 pro lightmapy bez překryvů.
  3. Bake normal, AO a curvature mapy z highpoly; sloučte ORM kanály.
  4. Vytvořte LOD řady a impostory; validujte přepínání.
  5. Exportujte do GLB s KTX2 texturami a kompresí Draco/meshopt.
  6. Otestujte výsledný model v cílovém enginu (WebGL/WebGPU nebo hra), kontrolujte draw cally, využití VRAM, FPS a artefakty.
  7. Automatizujte v CI: validaci glTF, optimalizační kroky a generování náhledů.

Závěr: udržitelná rovnováha mezi kvalitou a výkonem

Optimalizace 3D modelů je proces hledání rovnováhy mezi vizuální věrností a provozními rozpočty. Disciplína v oblasti topologie, UV mapování a materiálů, promyšlené LOD a komprese geometrie i textur zásadně snižují zátěž renderingu a síťového přenosu. Standard glTF/GLB s rozšířeními a moderní pipeline (KTX2, Draco, meshopt) umožňuje doručit atraktivní, rychle načitatelné a multiplatformní 3D zážitky v hrách i webovém prostředí.