Dela via


Introduktion till texturer

En strukturresurs är en datastruktur för att lagra texels, som är den minsta enheten i en textur som kan läsas eller skrivas till. När texturen läses av en shader kan den filtreras av textursamplers.

En texturresurs är en strukturerad samling data som är utformad för att lagra texels. En texel representerar den minsta enheten i en struktur som kan läsas eller skrivas till av pipelinen. Till skillnad från buffertar kan texturer filtreras av texturprovtagare när de läses av shader-enheter. Typen av textur påverkar hur strukturen filtreras. Varje texel innehåller 1 till 4 komponenter, ordnade i något av de DXGI-format som definieras av DXGI_FORMAT uppräkning.

Strukturer skapas som en strukturerad resurs med en känd storlek. Varje textur kan dock vara typad eller typfri när resursen skapas, så länge typen är fullt specificerad med en vy när texturen är bunden till pipeline.

Strukturtyper

Direct3D stöder flera flyttalsrepresentationer. Alla flyttalsberäkningar utförs enligt en definierad delmängd av IEEE 754 32-bitars regler för flyttal med enkel precision.

Det finns flera typer av texturer: 1D, 2D, 3D, som var och en kan skapas med eller utan mipmaps. Direct3D har också stöd för strukturmatriser och texturer med flera exempel.

1D-texturer

En 1D-struktur i sin enklaste form innehåller texturdata som kan åtgärdas med en enda strukturkoordinat; Det kan visualiseras som en matris med texels, som du ser i följande bild.

Följande bild visar en 1D-struktur:

en 1d-textur

Varje texel innehåller ett antal färgkomponenter beroende på formatet på de data som lagras. Om du lägger till mer komplexitet kan du skapa en 1D-struktur med mipmap-nivåer, som du ser i följande bild.

en 1d-struktur med mipmap-nivåer

En mipmap-nivå är en textur som är en tvåpotens mindre än nivån ovanför. Den översta nivån innehåller mest information, varje efterföljande nivå är mindre. För en 1D-mipmap innehåller den minsta nivån en texel. Dessutom minskar MIP-nivåerna alltid ned till 1:1.

När mipmaps genereras för en udda storleksstruktur är nästa lägre nivå alltid jämn storlek (förutom när den lägsta nivån når 1). Diagrammet illustrerar till exempel en 5x1-struktur vars nästa lägsta nivå är en 2x1-struktur, vars nästa (och sista) mip-nivå är en textur i storlek 1x1. Nivåerna identifieras av ett index som kallas lod (detaljnivå) som används för att komma åt den mindre strukturen vid återgivning av geometri som inte är lika nära kameran.

1D-strukturmatriser

Direct3D stöder också matriser med texturer. En matris med 1D-texturer ser konceptuellt ut som följande bild.

en matris med 1d-texturer

Den här texturmatrisen innehåller tre texturer. Var och en av de tre texturerna har en texturbredd på 5 (vilket är antalet element i det första lagret). Varje struktur innehåller också en 3-lagers mipmap.

Alla texturmatriser i Direct3D är en homogen matris med texturer. Det innebär att varje struktur i en texturmatris måste ha samma dataformat och storlek (inklusive texturbredd och antal mipmap-nivåer). Du kan skapa texturmatriser av olika storlekar, så länge alla texturer i varje matris matchar i storlek.

2D-texturer och 2D-strukturmatriser

En Texture2D-resurs innehåller ett 2D-rutnät med texels. Varje texel kan adresseras av en u, v-vektor. Eftersom det är en strukturresurs kan den innehålla mipmap-nivåer och underresurser. En helt ifylld 2D-strukturresurs ser ut som följande bild.

en 2D-texturresurs

Den här strukturresursen innehåller en enda 3x5-struktur med tre mipmap-nivåer.

En 2D-strukturmatrisresurs är en homogen matris med 2D-texturer. det vill: varje struktur har samma dataformat och dimensioner (inklusive mipmap-nivåer). Den har en liknande layout som 1D-texturmatrisen förutom att texturerna nu innehåller 2D-data, som visas i följande bild.

en matris med 2d-texturer

Den här texturmatrisen innehåller tre texturer; varje struktur är 3x5 med två mipmap nivåer.

Använda en 2D-strukturmatris som en texturkub

En texturkub är en 2D-strukturmatris som innehåller 6 texturer, en för varje kub. En helt ifylld texturkub ser ut som följande bild.

en matris med 2d-texturer som representerar en texturkub

En 2D-texturmatris som innehåller 6 texturer kan läsas inifrån shader-program med de inbyggda funktionerna för kubkartor, efter att de är bundna till pipelinen med en kubliknande texturvy. Texturkuber adresseras från skuggningen med en 3D-vektor som pekar ut från mitten av texturkuben.

3D-texturer

En 3D-texturresurs (även kallad volymtextur) innehåller en 3D-volym med texlar. Eftersom det är en strukturresurs kan den innehålla mipmap-nivåer. En helt ifylld 3D-struktur ser ut som följande bild.

en 3D-strukturresurs

När en 3D-struktur mipmap-sektor är bunden som en återgivningsmålutdata (med en återgivningsmålvy) fungerar 3D-strukturen identiskt med en 2D-strukturmatris med n sektorer. Den specifika renderingsdelen väljs från geometrishaderstadiet.

Det finns inget begrepp om en 3D-strukturmatris; Därför är en 3D-strukturunderresurs en enda mipmap-nivå.

Koordinatsystem för Direct3D definieras för pixlar och texels.

Pixelkoordinatsystem

Pixelkoordinatsystemet i Direct3D definierar ursprunget för ett återgivningsmål i det övre vänstra hörnet, enligt följande diagram. Pixelcentrum är förskjutna med (0,5f, 0,5f) från heltalslägen.

diagram över pixelkoordinatsystemet i direct3d 10

Texel-koordinatsystem

Texelkoordinatsystemet har sitt ursprung i det övre vänstra hörnet av strukturen, enligt följande diagram. Detta gör renderingen av skärmjusterade texturer trivial, eftersom pixelkoordinatsystemet är justerat med texelkoordinatsystemet.

diagram över texelkoordinatsystemet

Strukturkoordinater representeras med antingen ett normaliserat eller ett skalat tal. varje strukturkoordinat mappas till en specifik texel enligt följande:

För en normaliserad koordinat:

  • Punktsampling: Texel # = floor(U * Width)
  • Linjär sampling: Vänster Texel # = floor(U * Bredd), Höger Texel # = Vänster Texel # + 1

För en skalad koordinat:

  • Punktsampling: Texel # = floor(U)
  • Linjär sampling: Vänster Texel nr = floor(U - 0.5), Höger Texel nr = Vänster Texel nr + 1

Där bredden är bredden på strukturen (i texels).

Strukturadressomslutning sker efter att texelns position har beräknats.

Texturer