kalingTakéCullování, Visibility cullingPokročilý

Definice

Culling je technika v grafickém programování, která před vykreslením vyřazuje objekty, plochy nebo fragmenty považované za neviditelné či nepodstatné pro aktuální záběr. Cílem je snížit počet výpočtů pro GPU, šetřit paměťovou propustnost a udržet stabilní snímkovou frekvenci bez změny viditelného výsledku.

Kategorie: Grafické programováníAktualizováno

Nezaměňujte: Culling může obecně znamenat vyřazování položek ze sady, ale v tomto hesle jde o optimalizaci vykreslování v počítačové grafice.

Proč renderer zahazuje práci před kreslením

Culling řeší jednoduchý problém: scéna může obsahovat mnohem víc geometrie, než divák v daném snímku skutečně uvidí. Grafická aplikace proto předá GPU jen část objektů nebo část ploch, u kterých má smysl pokračovat ve vykreslování. Výsledek má vypadat stejně, ale cesta k němu je kratší.

Úspora není jen v počtu trojúhelníků. Culling omezuje draw cally, transformace vrcholů, čtení textur, stínovací výpočty i tlak na paměťovou propustnost. U her a interaktivních 3D aplikací často rozhoduje o tom, zda se scéna vejde do rozpočtu jednoho snímku.

Druhy cullingu v grafické pipeline

Back-face culling

Back-face culling vyřazuje zadní strany ploch. Trojúhelník má orientaci danou pořadím vrcholů, například proti směru hodinových ručiček. Když kamera vidí opačnou stranu, renderer může trojúhelník přeskočit, protože uzavřený objekt typicky ukazuje jen vnější povrch.

Frustum culling

Frustum culling porovnává objekty se zorným objemem kamery. Objekt mimo kamerový kužel se do snímku nemůže dostat, takže aplikace nemusí posílat jeho mesh do další fáze renderingu. V praxi se často testuje zjednodušený obal, například koule nebo axis-aligned bounding box, nikoli každý trojúhelník.

Occlusion culling

Occlusion culling vyřazuje objekty zakryté jinou geometrií. Budova za zdí nebo místnost za zavřenými dveřmi mohou být geometricky v záběru, ale stejně nejsou vidět. Tento typ bývá náročnější, protože renderer musí odhadnout nebo ověřit, co skutečně něco překrývá.

Dva příklady z praxe

Uzavřený model ve WebGL

Vývojář kreslí krychli nebo postavu složenou z uzavřených meshů. Zadní strany nikdy nemají být vidět, takže WebGL může zahodit odvrácené trojúhelníky. Scéna má stejný vzhled, ale fragment shader dostane méně práce.

gl.enable(gl.CULL_FACE);
gl.cullFace(gl.BACK);
gl.frontFace(gl.CCW);

Město v open-world scéně

Herní engine drží v paměti celé město, ale kamera míří jen do jedné ulice. Frustum culling vyřadí čtvrti mimo záběr a occlusion culling může přeskočit auta schovaná za domy. Snímek se vykreslí rychleji, aniž hráč vidí prázdná místa.

Kdy culling poškodí obraz

Culling selhává hlavně tehdy, když předpoklad neviditelnosti neplatí. Jednostranný materiál na listu rostliny, látce nebo papíru může při back-face cullingu zmizet z jedné strany. Špatně nastavené pořadí vrcholů zase obrátí přední a zadní stranu, takže objekt vypadá děravě.

Agresivní frustum nebo occlusion culling může způsobit popping: objekt náhle naskočí až ve chvíli, kdy už měl být vidět. Robustní engine proto pracuje s bezpečnostní rezervou, hierarchií obalů a testy přizpůsobenými konkrétní scéně.

Příklady z praxe

  1. Uzavřený model ve WebGL

    Vývojář kreslí uzavřený 3D model ve WebGL, například krychli nebo herní postavu. Zadní strany povrchu nemají být nikdy vidět, takže WebGL může přeskočit odvrácené trojúhelníky. Výsledek vypadá stejně, ale GPU zpracuje méně fragmentů.

    gl.enable(gl.CULL_FACE);
    gl.cullFace(gl.BACK);
    gl.frontFace(gl.CCW);
  2. Město v open-world scéně

    Herní engine načte celé město, ale kamera míří do úzké ulice. Frustum culling vyřadí čtvrti mimo záběr a occlusion culling přeskočí auta zakrytá domy. Hráč vidí plynulejší scénu bez toho, aby se změnil obsah záběru.

Časté omyly

MýtusCulling vždy jen zrychlí rendering a nemůže změnit obraz.
Ve skutečnostiCulling může obraz rozbít, pokud renderer špatně odhadne viditelnost. Typické následky jsou mizející plochy, náhlé doskakování objektů nebo průhledné modely bez rubové strany.
MýtusBack-face culling je vhodný pro každý 3D model.
Ve skutečnostiBack-face culling je bezpečný hlavně u uzavřených objemových meshů. Tenké povrchy, vegetace a některé transparentní materiály často potřebují oboustranné kreslení nebo speciální shader.

Časté dotazy

Je culling totéž co clipping?
Culling není totéž co clipping, i když oba postupy omezují to, co se nakonec kreslí. Culling obvykle rozhoduje předem, zda se celý objekt nebo plocha vůbec pošle dál do renderingu. Clipping naopak řeže geometrii podle hranice zorného objemu nebo jiné roviny, takže část primitiva může zůstat a část zmizet.
Kdy back-face culling raději vypnout?
Back-face culling se vypíná u objektů, které mají být viditelné z obou stran. Typickým příkladem jsou listy stromů, vlasy, tráva, látka, tenký papír nebo průhledné panely. Alternativou bývá oboustranný materiál, samostatná geometrie pro druhou stranu nebo shader, který s rubovou stranou zachází vědomě.
Zvýší culling vždy výkon hry nebo 3D aplikace?
Culling může zvýšit počet snímků za sekundu, ale zlepšení závisí na scéně a úzkém hrdle. Culling pomáhá hodně u rozsáhlých scén s mnoha neviditelnými objekty. Culling pomůže málo, když výkon brzdí fyzika, skripty, postprocessing nebo velmi drahé shadery na objektech, které jsou stejně viditelné.
Proč po zapnutí cullingu mizí části modelu?
Culling může způsobit mizení objektů, když má mesh špatné pořadí vrcholů, nepřesný bounding box nebo příliš agresivní occlusion test. Příčina často nevypadá jako chyba optimalizace, ale jako rozbitý model. Ladění obvykle začíná zobrazením obalových těles, vypnutím jednotlivých typů cullingu a kontrolou orientace normál.

Zdroje

  1. WebGLRenderingContext: cullFace() method(otevře se v novém okně)MDN Web Docs
  2. Face Culling(otevře se v novém okně)Khronos Group
  3. Back-face culling(otevře se v novém okně)Wikipedia

Související pojmy

Potřebujete to vyřešit v praxi?

Poradíme, jak na to ve vašem projektu

Vysvětlit pojem je jedna věc, navrhnout kolem něj funkční řešení druhá. Ozvěte se a probereme, co dává smysl u vás.