Sdílet prostřednictvím


Úvod do textur

Prostředek textury je datová struktura pro ukládání texelů, což je nejmenší jednotka textury, kterou lze číst nebo do které lze zapisovat. Pokud shader přečte texturu, může být filtrována pomocí texturových vzorkovačů.

Texturový prostředek je strukturovaná kolekce dat navržená pro ukládání texelů. texel představuje nejmenší jednotku textury, kterou lze číst nebo zapisovat prostřednictvím potrubí. Na rozdíl od bufferů lze textury filtrovat pomocí vzorkovníků textur, když jsou čteny shaderovými jednotkami. Typ textury ovlivňuje způsob filtrování textury. Každý texel obsahuje 1 až 4 komponenty uspořádané do jednoho z formátů DXGI definovaných DXGI_FORMAT výčtem.

Textury se vytvářejí jako strukturovaný prostředek se známou velikostí. Každá textura však může být při vytvoření prostředku typu nebo beze typu, pokud je typ plně specifikován pomocí zobrazení, když je textura připojena k potrubí.

typy textur

Direct3D podporuje několik formátů s pohyblivou řádovou čárkou. Všechny výpočty s plovoucí řádovou čárkou se řídí definovanou podmnožinou pravidel IEEE 754 pro jednoduchou přesnost (32 bitů).

Existuje několik typů textur: 1D, 2D, 3D, z nichž každý lze vytvořit pomocí mipmap nebo bez nich. Direct3D také podporuje texturová pole a vícevzorkové textury.

1D textury

1D textura v nejjednodušší formě obsahuje texturová data, která lze řešit s jedinou souřadnicí textury; lze ji vizualizovat jako pole texelů, jak je znázorněno na následujícím obrázku.

Následující obrázek znázorňuje 1D texturu:

1d textura

Každý texel obsahuje řadu barevných složek v závislosti na formátu uložených dat. Přidáním větší složitosti můžete vytvořit 1D texturu s úrovněmi mipmap, jak je znázorněno na následujícím obrázku.

1D texturu s úrovněmi detailů mipmap

Úroveň mipmap je textura, která je menší o mocninu dvou než úroveň nad ní. Nejvyšší úroveň obsahuje nejvíce podrobností, každá další úroveň je menší. Pro 1D mipmapu obsahuje nejmenší úroveň jeden texel. Kromě toho se úrovně MIP vždy snižují na 1:1.

Při generování mipmap pro texturu liché velikosti je další nižší úroveň vždy sudá (s výjimkou případů, kdy nejnižší úroveň je 1). Například diagram znázorňuje texturu 5x1, jejíž další nejnižší úroveň je textura 2x1, jejíž další (a poslední) úroveň mip je textura velikosti 1x1. Úrovně jsou identifikovány indexem označovaným jako LOD (úroveň podrobností), který se používá pro přístup k menší texturě při vykreslování geometrie, která není tak blízko fotoaparátu.

1D texturové pole

Direct3D také podporuje pole textur. Pole 1D textur vypadá koncepčně jako na následujícím obrázku.

pole textur 1-D

Toto pole textury obsahuje tři textury. Každá ze tří textur má šířku textury 5 (což je počet prvků v první vrstvě). Každá textura obsahuje také 3 vrstvy mipmap.

Všechna pole textury v Direct3D jsou homogenní pole textur; to znamená, že každá textura v poli textury musí mít stejný formát a velikost dat (včetně šířky textury a počtu úrovní mipmap). Můžete vytvořit pole textur různých velikostí, pokud se všechny textury v každém poli shodují ve velikosti.

2D textury a 2D pole textur

Prostředek Texture2D obsahuje 2D mřížku texelů. Každý texel je adresovatelný vektorem u, v. Vzhledem k tomu, že se jedná o texturový prostředek, může obsahovat úrovně mipmap a podzdroje. Plně naplněný 2D texturový zdroj vypadá jako na následující ilustraci.

a 2D zdroj textury

Tento zdroj textury obsahuje jednu texturu o velikosti 3x5 se třemi úrovněmi mipmap.

Zdroj pole 2D textur je homogenním polem 2D textur; to znamená, že každá textura má stejný formát a rozměry dat (včetně mipmapových úrovní). Má podobné rozložení jako pole textur 1D s tím rozdílem, že textury teď obsahují 2D data, jak je znázorněno na následujícím obrázku.

pole 2D textur

Toto pole textury obsahuje tři textury; každá textura je 3x5 se dvěma úrovněmi mipmap.

použití 2D pole textur jako texturové krychle

Texturová krychle je 2D pole textur, které obsahuje 6 textur, jedna pro každou stranu krychle. Plně naplněná texturová krychle vypadá jako na následujícím obrázku.

pole 2d textur, které představují texturovou krychli

Pole textur 2D, které obsahuje 6 textur, může být načteno z shaderů prostřednictvím vnitřních funkcí krychlové mapy, jakmile jsou připojena k pipeline pomocí zobrazení krychlové textury. Texturové krychle jsou adresovány ze shaderu pomocí 3D vektoru, který směřuje ze středu texturové krychle.

3D textury

3D texturový prostředek (označovaný také jako objemová textura) obsahuje 3D objem texelů. Protože se jedná o prostředek textury, může obsahovat úrovně mipmap. Plně naplněná 3D textura vypadá jako na následujícím obrázku.

zdroj textury 3D

Když je plátek mipmap 3D textury přiřazen jako výstup pro vykreslování (se zobrazením cílového vykreslování), 3D textura se chová stejně jako pole 2D textur s n plátky. Konkrétní řez vykreslení je vybrán z fáze geometrického shaderu.

Neexistuje žádný koncept pole 3D textur; podsložka 3D textury je tedy jedna úroveň mipmapy.

Souřadnicové systémy pro Direct3D jsou definovány pro pixely a texely.

pixelový souřadnicový systém

Souřadnicový systém pixelů v Direct3D definuje původ cíle vykreslení v levém horním rohu, jak je znázorněno v následujícím diagramu. Středy pixelů jsou posunuty o (0,5f,0,5f) ze souřadnic celých čísel.

diagram souřadnicového systému pixelů v direct3d 10

souřadnicový systém Texel

Souřadnicový systém texelu má svůj původ v levém horním rohu textury, jak je znázorněno na následujícím diagramu. Díky tomu je zarovnání textur na obrazovce triviální, protože souřadnicový systém pixelů je zarovnaný se souřadnicovým systémem texelů.

diagram souřadnicového systému texelu

Souřadnice textury jsou reprezentovány normalizovaným nebo škálovaným číslem; každá souřadnice textury je namapována na konkrétní texel následujícím způsobem:

Pro normalizovanou souřadnici:

  • Vzorkování bodů: Texel # = floor(U * Šířka)
  • Lineární vzorkování: Levý texel # = podlaha(U * šířka), Pravý texel # = Levý texel # + 1

Pro souřadnici s měřítkem:

  • Vzorkování bodů: Texel # = floor(U)
  • Lineární vzorkování: Left Texel # = floor(U - 0,5), Right Texel # = Left Texel # + 1

Kde je šířka, je šířka textury (v texels).

Obtékání adresy textury probíhá po výpočtu umístění texelu.

Textury