Takétexture map, texelová mapa, bitmapová texturaPokročilý

Definice

Textura je datový obraz nebo procedurální vzor, který se v počítačové grafice používá k určení vzhledu povrchu objektu. Může nést barvu, průhlednost, drsnost, normály nebo jiné hodnoty, které shader čte při vykreslování. Textury umožňují bohatý detail bez modelování každé nerovnosti geometrií a výrazně ovlivňují paměť i výkon.

Kategorie: Grafické programováníAktualizováno

Nezaměňujte: Textura se v tomto hesle chápe jako pojem počítačové grafiky, ne jako hmatová vlastnost materiálu nebo obecný vizuální vzor v designu.

Co textura přidává k povrchu

Textura v grafickém enginu doplňuje geometrii o informace, které by bylo drahé nebo nemožné nést přímo ve vrcholech modelu. Nejčastěji jde o dvourozměrný obrázek, ale textura může být také objemová, krychlová, procedurálně generovaná nebo použitá jako výstupní paměť pro další výpočet. Jeden model tak může mít jednoduchou síť polygonů a přesto působit jako kámen, kůže, kov, dřevo nebo displej.

Textura nemusí obsahovat jen barvu. V moderním PBR workflow se používají samostatné mapy pro albedo, normal, roughness, metallic, ambient occlusion nebo opacity. Shader z těchto dat skládá výsledný vzhled podle světla, kamery a materiálových pravidel.

Od UV souřadnic k texelům

UV souřadnice říkají, které místo textury patří ke kterému místu na povrchu modelu. Hodnoty se obvykle zapisují v rozsahu 0 až 1, kde dvojice souřadnic ukazuje polohu v texturovém prostoru. Grafická karta při rasterizaci dopočítá UV pro každý fragment a sampler z textury vybere odpovídající texel nebo interpolovanou hodnotu.

Vzorkování rozhoduje o tom, jak textura vypadá při zvětšení, zmenšení nebo šikmém pohledu. Nearest filtering dává tvrdé pixely, linear filtering obraz vyhlazuje. Mipmapy ukládají menší verze stejné textury, aby vzdálené plochy neblikaly a aby se zbytečně nečetla příliš podrobná data.

Paměťová cena detailu

Velká textura zvyšuje ostrost jen tehdy, když má model dost místa na obrazovce a UV rozložení využívá její rozlišení smysluplně. Textury zároveň zabírají paměť GPU, zatěžují propustnost a mohou prodlužovat načítání scény. Herní engine proto často používá kompresi, streamování, texturové atlasy nebo různé úrovně detailu.

Problémem nebývá pouze velikost souboru na disku. Rozbalená textura v paměti grafické karty může být výrazně větší než PNG nebo JPEG soubor. Formáty určené pro GPU kompresi řeší hlavně rychlé čtení při vykreslování, ne jen archivní úsporu místa.

Příklady z praxe

  1. Rezavý kontejner ve hře. Model kontejneru má jen jednoduché hrany a několik prolisů, ale albedo textura přidá špínu, rez a staré nálepky. Normal mapa vytvoří dojem drobných nerovností bez přidání polygonů. Výsledek působí detailněji, zatímco počet trojúhelníků zůstane nízký.
  2. WebGL náhled produktu. E-shop načte texturu potisku trička a shader ji použije při kreslení každého fragmentu. Změna obrázku okamžitě ukáže jiný design bez nového modelu.
    uniform sampler2D albedoMap;
    in vec2 vUv;
    out vec4 fragColor;
    void main() {
      vec4 albedo = texture(albedoMap, vUv);
      fragColor = albedo;
    }

Kde textura není totéž co materiál

Materiál popisuje pravidla, podle kterých se povrch chová při osvětlení. Textura je jedna z datových vstupů materiálu. Stejná textura dřeva může být použita v matném materiálu, lakovaném materiálu nebo jako maska, která jen určuje, kde má být povrch tmavší. Záměna těchto pojmů vede k nejasné komunikaci mezi grafikem, technickým artistou a vývojářem.

Příklady z praxe

  1. Rezavý kontejner ve hře

    Model kontejneru má jen jednoduché hrany a několik prolisů, ale albedo textura přidá špínu, rez a staré nálepky. Normal mapa vytvoří dojem drobných nerovností bez přidání polygonů. Výsledek působí detailněji, zatímco počet trojúhelníků zůstane nízký.

  2. WebGL náhled produktu

    E-shop načte texturu potisku trička a shader ji použije při kreslení každého fragmentu. Změna obrázku okamžitě ukáže jiný design bez nového modelu.

    uniform sampler2D albedoMap;
    in vec2 vUv;
    out vec4 fragColor;
    void main() {
      vec4 albedo = texture(albedoMap, vUv);
      fragColor = albedo;
    }

Časté omyly

MýtusTextura je vždycky jen obrázek nalepený na model.
Ve skutečnostiTextura bývá obrázek, ale grafická API ji používají obecněji. Textura může nést normály, masky, hloubku, výsledek renderování nebo hodnoty pro výpočet ve shaderu.
MýtusČím větší textura, tím lepší grafika.
Ve skutečnostiVětší textura pomůže jen tehdy, když ji kamera a UV rozložení dokážou využít. Nadměrné rozlišení často jen plýtvá pamětí GPU a prodlužuje načítání.
MýtusMateriál a textura jsou totéž.
Ve skutečnostiMateriál určuje chování povrchu při osvětlení, zatímco textura dodává konkrétní data pro tento výpočet. Jeden materiál může používat více textur a jedna textura může sloužit různým materiálům.

Časté dotazy

Proč textura na modelu vypadá rozmazaně?
Rozmazaná textura obvykle vzniká kombinací nízkého rozlišení, nevhodného UV rozložení, příliš agresivní komprese nebo filtrování při zvětšení. Textura může mít dost pixelů v souboru, ale malý ostrov v UV mapě dostane jen malou část obrazu. Při kontrole je užitečné porovnat velikost textury, texel density na modelu a vzdálenost kamery, pro kterou je asset určen.
Co znamená bezešvá textura?
Bezešvá textura je textura připravená tak, aby na sebe při opakování navazovaly její levý a pravý okraj a obvykle také horní a dolní okraj. Bezešvá textura se hodí pro cihly, dlažbu, trávu nebo látku, protože umožní pokrýt velkou plochu jedním menším obrázkem. Viditelné opakování vzoru se ale může stát problémem, pokud jsou v obraze nápadné skvrny nebo unikátní detaily.
Může textura obsahovat i jiná data než obrázek?
Textura může být použita i mimo klasický 3D model, například jako render target, maska v postprocess efektu, lookup table pro barevnou korekci nebo datová mřížka pro výpočet na GPU. Grafické API často zachází s texturou jako s obecnou pamětí se speciálním způsobem adresování a filtrování. Obrazový obsah je jen nejběžnější případ použití.
Jak se textura pro 3D asset běžně vytváří?
Textura se obvykle kreslí v grafickém editoru, peče z detailního modelu, snímá z fotogrammetrie nebo generuje procedurálně. V produkci se často kombinuje více přístupů: základ vznikne z fotografií, normal mapa se upeče z high-poly modelu a masky se doladí ručně. Důležité je, aby výsledná textura odpovídala cílovému enginu, barevnému prostoru a materiálovému workflow.

Zdroje

  1. Using textures in WebGL(otevře se v novém okně)MDN Web Docs
  2. glTexImage2D - OpenGL 4 Reference Pages(otevře se v novém okně)Khronos Group
  3. glTF 2.0 Specification(otevře se v novém okně)Khronos Group
  4. WebGPU(otevře se v novém okně)W3C

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.