Resurstyper (Direct3D 10)

Alla resurser som används av Direct3D-pipelinen härleds från två grundläggande resurstyper: buffertar och texturer. En buffert är en samling rådata (element). en textur är en samling texels (texturelement).

Det finns två sätt att helt ange layouten (eller minnesfotavtrycket) för en resurs:

Sak Beskrivning
skrivet
Ange helt och hållet typen när resursen skapas.
utan typ
Ange fullständigt typen när resursen är bunden till pipelinen.

 

Buffertresurser

En buffertresurs är en samling fullständigt maskinskrivna data. internt innehåller en buffert element. Ett element består av 1 till 4 komponenter. Exempel på elementdatatyper är: ett paketerat datavärde (som R8G8B8A8), ett enda 8-bitars heltal, fyra 32-bitars flyttalsvärden. Dessa datatyper används för att lagra data, till exempel en positionsvektor, en normal vektor, en strukturkoordinat i en hörnbuffert, ett index i en indexbuffert eller enhetstillstånd.

En buffert skapas som en ostrukturerad resurs. Eftersom den är ostrukturerad kan en buffert inte innehålla några mipmap-nivåer, filtreras inte vid läsning och kan inte vara flersampling.

Bufferttyper

Brytpunktsbuffert

En buffert är en samling element. en brytpunktsbuffert innehåller data per hörn. Det enklaste exemplet är en brytpunktsbuffert som innehåller en typ av data, till exempel positionsdata. Den kan visualiseras som följande bild.

bild av en brytpunktsbuffert som innehåller positionsdata

Oftast innehåller en brytpunktsbuffert alla data som behövs för att helt ange 3D-hörn. Ett exempel på detta kan vara en brytpunktsbuffert som innehåller koordinater för position per hörn, normal och textur. Dessa data är vanligtvis ordnade som uppsättningar med element per hörn, som du ser i följande bild.

bild av en brytpunktsbuffert som innehåller position, normal data och texturdata

Den här hörnbufferten innehåller data per hörn för åtta hörn. varje hörn lagrar tre element (position, normal och strukturkoordinater). Positionen och det normala anges vanligtvis med tre 32-bitars floats (DXGI_FORMAT_R32G32B32_FLOAT) och strukturkoordinaterna med två 32-bitars floats (DXGI_FORMAT_R32G32_FLOAT).

För att komma åt data från en brytpunktsbuffert måste du veta vilket hörn som ska kommas åt och dessa andra buffertparametrar:

  • Offset – antalet byte från början av bufferten till data för det första hörnet. Förskjutningen levereras till IASetVertexBuffers.
  • BaseVertexLocation – antalet byte från förskjutningen till det första hörnet som används av lämpligt anrop (se Draw Methods).

Innan du skapar en brytpunktsbuffert måste du definiera dess layout genom att skapa ett indatalayoutobjekt; detta görs genom att anropa CreateInputLayout. När objektet för indatalayout har skapats binder du det till indata-assembler-fasen genom att anropa IASetInputLayout.

Om du vill skapa en brytpunktsbuffert anropar du CreateBuffer.

Indexbuffert

En indexbuffert innehåller en sekventiell uppsättning 16-bitars- eller 32-bitarsindex. varje index används för att identifiera ett hörn i en brytpunktsbuffert. Att använda en indexbuffert med en eller flera hörnbuffertar för att skicka data till IA-fasen kallas indexering. En indexbuffert kan visualiseras som följande bild.

bild av en indexbuffert

De sekventiella index som lagras i en indexbuffert finns med följande parametrar:

  • Offset – antalet byte från början av bufferten till det första indexet. Förskjutningen levereras till IASetIndexBuffer.
  • StartIndexLocation – antalet byte från förskjutningen till det första hörnet som används av lämpligt anrop (se Draw Methods).
  • IndexCount – antalet index som ska återges.

Om du vill skapa en indexbuffert anropar du CreateBuffer.

En indexbuffert kan sammanfoga flera linje- eller triangellister genom att avgränsa var och en med ett bandklippt index. Ett bandklippt index gör att flera linje- eller triangellister kan ritas med ett enda ritningsanrop. Ett strip-cut-index är helt enkelt det maximala möjliga värdet för indexet (0xffff för ett 16-bitars index, 0xffffffff för ett 32-bitars index). Strip-cut index återställer lindningsordningen i indexerade primitiver och kan användas för att ta bort behovet av degenererade trianglar som annars kan krävas för att upprätthålla rätt lindningsordning i en triangelremsa. Följande bild visar ett exempel på ett bandklippt index.

bild av ett bandklippt index

Konstant buffert

Direct3D 10 introducerade en ny buffert för att tillhandahålla skuggningskonstanter som kallas skuggningskonstantbuffert eller helt enkelt en konstant buffert. Konceptuellt ser det ut precis som en hörnbuffert med ett element, som du ser i följande bild.

bild av en skuggningskonstant buffert

Varje element lagrar en 1-till-4-komponentkonstant, som bestäms av formatet på de data som lagras.

Konstanta buffertar minskar den bandbredd som krävs för att uppdatera skuggningskonstanter genom att tillåta att skuggningskonstanter grupperas och checkas in samtidigt i stället för att göra enskilda anrop för att checka in varje konstant separat.

Om du vill skapa en skuggningskonstantbuffert anropar du CreateBuffer och anger flaggan för konstant buffertbindning D3D10_BIND_CONSTANT_BUFFER (se D3D10_BIND_FLAG).

Om du vill binda en skuggningskonstantbuffert till pipelinen anropar du någon av följande metoder: GSSetConstantBuffers, PSSetConstantBufferseller VSSetConstantBuffers.

Observera att när du använder ID3D10Effect Interface gränssnitt hanteras processen för att skapa, binda och komittera en konstant buffert av ID3D10Effect Interface instans. I så fall är det bara nödvändigt att hämta variabeln från effekten med någon av GetVariable-metoderna, till exempel GetVariableByName och uppdatera variabeln med någon av SetVariable-metoderna, till exempel SetMatrix. Ett exempel på hur du använder ID3D10Effect Interface för att hantera en konstant buffert finns i självstudie 07.

En skuggning fortsätter att läsa variabler i en konstant buffert direkt efter variabelnamn på samma sätt som variabler som inte ingår i en konstant buffert läse.

Varje skuggningssteg tillåter upp till 15 skuggningskonstanta buffertar. varje buffert kan innehålla upp till 4 096 konstanter.

Använd en konstant buffert för att lagra resultatet av stream-output-fasen.

Se Shader Constants (DirectX HLSL) för ett exempel på att deklarera en konstant buffert i en skuggning.

Strukturresurser

En strukturresurs är en strukturerad samling data som utformats för att lagra texels. Till skillnad från buffertar kan texturer filtreras av texturprovtagare när de läss av skuggningsenheter. Typen av textur påverkar hur strukturen filtreras. En texel representerar den minsta enheten i en struktur som kan läsas eller skrivas till av pipelinen. Varje texel innehåller 1 till 4 komponenter, ordnade i något av DXGI-formaten (se DXGI_FORMAT).

Texturer skapas som en strukturerad resurs så att deras storlek är känd. Varje textur kan dock skrivas eller skrivas mindre vid resursskapandet, så länge typen är helt angiven med hjälp av en vy när strukturen är bunden till pipelinen.

Strukturtyper

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

1D-struktur

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.

bild av en 1d-struktur

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.

bild av en 1d-struktur med mipmap-nivåer

En mipmap-nivå är en struktur som är en tvåeffekt mindre än nivån ovanför den. 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. De olika nivåerna identifieras av ett index som kallas lod (detaljnivå); du kan använda LOD för att komma åt en mindre struktur vid återgivning av geometri som inte är lika nära kameran.

1D-strukturmatris

Direct3D 10 har också en ny datastruktur för en matris med texturer. En matris med 1D-texturer ser konceptuellt ut som följande bild.

bild av en 1d-strukturmatris

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-struktur och 2D-strukturmatris

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.

bild av en 2D-strukturresurs

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

En Texture2DArray-resurs ä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 och därför ser ut som följande bild.

bild av en matris med 2d-strukturresurser

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

Använda en Texture2DArray 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.

bild av en matris med 2d-strukturresurser som representerar en texturkub

En 2D-strukturmatris som innehåller 6 texturer kan läsas inifrån skuggningar med kubkartans inbyggda funktioner, efter att de är bundna till pipelinen med en kubstrukturvy. Texturkuber adresseras från skuggningen med en 3D-vektor som pekar ut från mitten av texturkuben.

3D-struktur

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

bild av 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. Det specifika återgivningssegmentet väljs från geometri-skuggningssteget genom att deklarera en skalär komponent i utdata som SV_RenderTargetArrayIndex systemvärde.

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

Underresurser

Api:et Direct3D 10 refererar till hela resurser eller delmängder av resurser. För att ange en del av resurserna har Direct3D myntat termen underresurser, vilket innebär en delmängd av en resurs.

En buffert definieras som en enda underresurs. Texturer är lite mer komplicerade eftersom det finns flera olika typer av texturer (1D, 2D osv.) av vilka vissa stöder mipmap-nivåer och/eller strukturmatriser. Från och med det enklaste fallet definieras en 1D-struktur som en enda underresurs, enligt följande bild.

bild av en 1d-struktur

Det innebär att matrisen med texels som utgör en 1D-struktur finns i en enda underresurs.

Om du expanderar en 1D-struktur med tre mipmap-nivåer kan den visualiseras så här.

bild av en 1d-struktur med mipmap-nivåer

Tänk på detta som en enda textur som består av tre undertexter. Varje undertext räknas som en underresurs, så den här 1D-strukturen innehåller 3 underresurser. En undertext (eller underresurs) kan indexeras med hjälp av detaljnivån (LOD) för en enda struktur. När du använder en matris med texturer kräver åtkomst till en viss undertext både LOD och den specifika strukturen. Alternativt kombinerar API:et dessa två informationsdelar till ett enda nollbaserat underresursindex som visas här.

bild av ett nollbaserat underresursindex

Välja underresurser

Vissa API:ets åtkomst till en hel resurs (till exempel CopyResource), andra får åtkomst till en del av en resurs (till exempel UpdateSubresource eller CopySubresourceRegion). API:et som har åtkomst till en del av en resurs använder vanligtvis en vybeskrivning (till exempel D3D10_TEX2D_ARRAY_DSV) för att ange de underresurser som ska kommas åt.

Dessa siffror illustrerar de termer som används av en vybeskrivning vid åtkomst till en matris med texturer.

Matrissektor

Med tanke på en matris med texturer, varje struktur med mipmaps, innehåller en matrissektor (representerad av den vita rektangeln) en textur och alla dess undertexter, som visas i följande bild.

bild av en matrissplicering

Mip-sektor

En mip-sektor (representeras av den vita rektangeln) innehåller en mipmap-nivå för varje struktur i en matris, enligt följande bild.

bild av en mip-skarv

Välja en enskild underresurs

Du kan använda dessa två typer av sektorer för att välja en enda underresurs, som du ser i följande bild.

bild av hur du väljer en underresurs med hjälp av en matrissektor och en mip-splice

Välja flera underresurser

Eller så kan du använda dessa två typer av sektorer med antalet mipmap-nivåer och/eller antal texturer för att välja flera underresurser.

bild av att välja flera underresurser

Oavsett vilken strukturtyp du använder, med eller utan mipmaps, med eller utan en strukturmatris, kan du använda hjälpfunktionen D3D10CalcSubresourceför att beräkna indexet för en viss underresurs.

Stark kontra svag typning

Om du skapar en fullständigt typad resurs begränsas resursen till det format som den skapades med. På så sätt kan körningen optimera åtkomsten, särskilt om resursen skapas med flaggor som anger att den inte kan mappas av programmet. Resurser som skapats med en viss typ kan inte omtolkas med hjälp av visningsmekanismen.

I en typ mindre resurs är datatypen okänd när resursen först skapas. Programmet måste välja från den tillgängliga typen mindre format (se DXGI_FORMAT). Du måste ange storleken på det minne som ska allokeras och om körningen behöver generera undertexterna i en mipmap. Det exakta dataformatet (om minnet ska tolkas som heltal, flyttalvärden, osignerade heltal osv.) bestäms dock inte förrän resursen är bunden till pipelinen med en vy. Eftersom texturformatet förblir flexibelt tills strukturen är bunden till pipelinen kallas resursen för svag typ av lagring. Svagt skriven lagring har fördelen att den kan återanvändas eller omtolkas (i ett annat format) så länge komponentbiten i det nya formatet matchar bitantalet i det gamla formatet.

En enskild resurs kan bindas till flera pipelinesteg så länge var och en har en unik vy som fullständigt kvalificerar formaten på varje plats. En resurs som skapats med formatet DXGI_FORMAT_R32G32B32A32_TYPELESS kan till exempel användas som en DXGI_FORMAT_R32G32B32A32_FLOAT och en DXGI_FORMAT_R32G32B32A32_UINT på olika platser i pipelinen samtidigt.

resurser (Direct3D 10)