Delen via


Resourcetypen (Direct3D 10)

Alle resources die door de Direct3D-pijplijn worden gebruikt, zijn afgeleid van twee basisresourcetypen: buffers en patronen. Een buffer is een verzameling onbewerkte gegevens (elementen); een textuur is een verzameling texelse elementen (textuurelementen).

Er zijn twee manieren om de indeling (of geheugenvoetafdruk) van een resource volledig op te geven:

Item Beschrijving
getypt
Geef het type volledig op wanneer de resource wordt gemaakt.
typeloos
Geef het type volledig op wanneer de resource is gebonden aan de pijplijn.

 

Bufferbronnen

Een bufferresource is een verzameling volledig getypte gegevens; intern bevat een buffer elementen. Een element bestaat uit 1 tot 4 onderdelen. Voorbeelden van elementgegevenstypen zijn: een verpakte gegevenswaarde (zoals R8G8B8A8), één 8-bits geheel getal, vier 32-bits floatwaarden. Deze gegevenstypen worden gebruikt voor het opslaan van gegevens, zoals een positievector, een normale vector, een patrooncoördinaat in een hoekpuntbuffer, een index in een indexbuffer of apparaatstatus.

Er wordt een buffer gemaakt als een ongestructureerde resource. Omdat deze ongestructureerd is, kan een buffer geen mipmapniveaus bevatten, wordt niet gefilterd wanneer deze wordt gelezen en kan deze niet worden ge multisampled.

Buffertypen

Hoekpuntbuffer

Een buffer is een verzameling elementen; een hoekpuntbuffer bevat gegevens per hoekpunt. Het eenvoudigste voorbeeld is een hoekpuntbuffer die één type gegevens bevat, zoals positiegegevens. Deze kan worden gevisualiseerd zoals in de volgende afbeelding.

afbeelding van een hoekpuntbuffer die positiegegevens bevat

Vaker bevat een hoekpuntbuffer alle gegevens die nodig zijn om 3D-hoekpunten volledig op te geven. Een voorbeeld hiervan kan een hoekpuntbuffer zijn die per hoekpuntpositie, normale en patrooncoördinaten bevat. Deze gegevens zijn meestal ingedeeld als sets met elementen per hoekpunt, zoals wordt weergegeven in de volgende afbeelding.

afbeelding van een hoekpuntbuffer die positie-, normale en patroongegevens bevat

Deze hoekpuntbuffer bevat per hoekpuntgegevens voor acht hoekpunten; elk hoekpunt slaat drie elementen op (positie, normaal en patrooncoördinaten). De positie en normaal worden doorgaans opgegeven met behulp van drie 32-bits floats (DXGI_FORMAT_R32G32B32_FLOAT) en de patrooncoördinaten met behulp van twee 32-bits floats (DXGI_FORMAT_R32G32_FLOAT).

Als u toegang wilt krijgen tot gegevens vanuit een hoekpuntbuffer, moet u weten welk hoekpunt u wilt openen en welke andere bufferparameters u wilt gebruiken:

  • Verschuiving: het aantal bytes vanaf het begin van de buffer naar de gegevens voor het eerste hoekpunt. De offset wordt geleverd aan IASetVertexBuffers.
  • BaseVertexLocation: het aantal bytes van de offset naar het eerste hoekpunt dat wordt gebruikt door de juiste tekenoproep (zie Tekenmethoden).

Voordat u een hoekpuntbuffer maakt, moet u de indeling definiëren door een invoerindelingsobject te maken; Dit wordt gedaan door CreateInputLayout-aan te roepen. Zodra het object voor de invoerindeling is gemaakt, bindt u het aan de fase invoerassembly door IASetInputLayout-aan te roepen.

Als u een hoekpuntbuffer wilt maken, roept u CreateBuffer-aan.

Indexbuffer

Een indexbuffer bevat een reeks 16-bits of 32-bits indexen; elke index wordt gebruikt om een hoekpunt in een hoekpuntbuffer te identificeren. Het gebruik van een indexbuffer met een of meer hoekpuntbuffers voor het leveren van gegevens aan de IA-fase wordt indexering genoemd. Een indexbuffer kan worden gevisualiseerd zoals in de volgende afbeelding.

illustratie van een indexbuffer

De opeenvolgende indexen die zijn opgeslagen in een indexbuffer, bevinden zich met de volgende parameters:

  • Verschuiving: het aantal bytes vanaf het begin van de buffer naar de eerste index. De offset wordt geleverd aan IASetIndexBuffer.
  • StartIndexLocation: het aantal bytes van de offset naar het eerste hoekpunt dat wordt gebruikt door de juiste tekenoproep (zie Methoden tekenen).
  • IndexCount: het aantal indexen dat moet worden weergegeven.

Als u een indexbuffer wilt maken, roept u CreateBuffer-aan.

Een indexbuffer kan meerdere lijn- of driehoekstrips samenvoegen door elk met een strip-cut index te scheiden. Met een strip-cut index kunnen meerdere lijn- of driehoekstrips worden getekend met één tekenoproep. Een strip-cut-index is simpelweg de maximaal mogelijke waarde voor de index (0xffff voor een 16-bits index, 0xffffffff voor een 32-bits index). De strip-cut index stelt de wikkelvolgorde in geïndexeerde primitieven opnieuw in en kan worden gebruikt om de noodzaak te verwijderen voor degenerate driehoeken die anders vereist zijn om de juiste wikkelingsvolgorde in een driehoeksstrook te behouden. In de volgende afbeelding ziet u een voorbeeld van een strip-cut-index.

illustratie van een strip-cut index

Constante buffer

Direct3D 10 heeft een nieuwe buffer geïntroduceerd voor het leveren van arceringsconstanten, een arceringsconstante buffer of gewoon een constante buffer. Conceptueel gezien ziet het eruit als een hoekpuntbuffer met één element, zoals wordt weergegeven in de volgende afbeelding.

illustratie van een arceringsconstante buffer

Elk element slaat een 1-op-4-componentconstante op, bepaald door de indeling van de gegevens die zijn opgeslagen.

Constante buffers verminderen de bandbreedte die nodig is om shaderconstanten bij te werken door shaderconstanten samen te groeperen en tegelijkertijd vast te leggen in plaats van afzonderlijke aanroepen te voeren om elke constante afzonderlijk door te voeren.

Als u een arceringsconstante buffer wilt maken, roept u CreateBuffer- aan en geeft u de bindingsvlag voor de constante buffer op D3D10_BIND_CONSTANT_BUFFER (zie D3D10_BIND_FLAG).

Als u een arceringsconstante buffer aan de pijplijn wilt binden, roept u een van de volgende methoden aan: GSSetConstantBuffers, PSSetConstantBuffersof VSSetConstantBuffers.

Houd er rekening mee dat bij het gebruik van de ID3D10Effect Interface interface het proces voor het maken, binden en samenstellen van een constante buffer wordt verwerkt door de ID3D10Effect Interface exemplaar. In dat geval is het alleen nodig om de variabele op te halen uit het effect met een van de GetVariable-methoden zoals GetVariableByName en de variabele bij te werken met een van de SetVariable-methoden zoals SetMatrix. Zie zelfstudie 07voor een voorbeeld van het gebruik van ID3D10Effect Interface voor het beheren van een constante buffer.

Een shader blijft variabelen in een constante buffer lezen op dezelfde manier als variabelen die geen deel uitmaken van een constante buffer, worden gelezen.

Elke shaderfase biedt maximaal 15 arceringsconstante buffers; elke buffer kan maximaal 4096 constanten bevatten.

Gebruik een constante buffer om de resultaten van de stroomuitvoerfase op te slaan.

Zie Shader Constants (DirectX HLSL) voor een voorbeeld van het declareren van een constante buffer in een shader.

Structuurbronnen

Een patroonresource is een gestructureerde verzameling gegevens die zijn ontworpen om texels op te slaan. In tegenstelling tot buffers kunnen patronen worden gefilterd op texture samplers terwijl ze worden gelezen door shader-eenheden. Het type textuur heeft invloed op de manier waarop het patroon wordt gefilterd. Een texel vertegenwoordigt de kleinste eenheid van een textuur die door de pijplijn kan worden gelezen of geschreven. Elke texel bevat 1 tot 4 componenten, gerangschikt in een van de DXGI-indelingen (zie DXGI_FORMAT).

Patronen worden gemaakt als een gestructureerde resource, zodat hun grootte bekend is. Elke textuur kan echter worden getypt of minder worden getypt tijdens het maken van resources, zolang het type volledig is opgegeven met behulp van een weergave wanneer het patroon is gebonden aan de pijplijn.

Patroontypen

Er zijn verschillende soorten patronen: 1D, 2D, 3D, die elk kunnen worden gemaakt met of zonder mipmaps. Direct3D 10 ondersteunt ook bitmapmatrices en multisampled texturen.

1D-patroon

Een 1D-patroon in de eenvoudigste vorm bevat patroongegevens die kunnen worden aangepakt met één patrooncoördinaat; het kan worden gevisualiseerd als een matrix van texels, zoals wordt weergegeven in de volgende afbeelding.

illustratie van een 1d-patroon

Elke texel bevat een aantal kleuronderdelen, afhankelijk van de indeling van de opgeslagen gegevens. Door meer complexiteit toe te voegen, kunt u een 1D-patroon maken met mipmapniveaus, zoals wordt weergegeven in de volgende afbeelding.

illustratie van een 1d-patroon met mipmapniveaus

Een mipmap-niveau is een patroon dat een kracht van twee kleiner is dan het niveau erboven. Het hoogste niveau bevat het meeste detail, elk volgend niveau is kleiner; voor een 1D mipmap bevat het kleinste niveau één texel. De verschillende niveaus worden geïdentificeerd door een index genaamd een LOD (niveau van detail); u kunt de LOD gebruiken om toegang te krijgen tot een kleinere textuur bij het weergeven van geometrie die niet zo dicht bij de camera ligt.

1D-patroonmatrix

Direct3D 10 heeft ook een nieuwe gegevensstructuur voor een matrix met patronen. Een matrix van 1D-patronen ziet er conceptueel uit zoals in de volgende afbeelding.

illustratie van een matrix met 1d patronen

Deze patroonmatrix bevat drie patronen. Elk van de drie patronen heeft een textuurbreedte van 5 (het aantal elementen in de eerste laag). Elk patroon bevat ook een mipmap met drie lagen.

Alle patroonmatrices in Direct3D zijn een homogene matrix met patronen; Dit betekent dat elk patroon in een patroonmatrix dezelfde gegevensindeling en -grootte moet hebben (inclusief de breedte en het aantal mipmapniveaus). U kunt bitmapmatrixen van verschillende grootten maken, zolang alle patronen in elke matrix overeenkomen met de grootte.

2D-patroon en 2D-patroonmatrix

Een Texture2D-resource bevat een 2D-raster van texels. Elke texel is adresseerbaar door een u, v vector. Omdat het een patroonresource is, kan deze mipmapniveaus en subresources bevatten. Een volledig gevulde 2D-patroonresource ziet eruit als in de volgende afbeelding.

illustratie van een 2d-patroonresource

Deze patroonresource bevat één 3x5-patroon met drie mipmapniveaus.

Een Texture2DArray-resource is een homogene matrix van 2D-patronen; Dat wil gezegd: elk patroon heeft dezelfde gegevensindeling en dimensies (inclusief mipmapniveaus). Het heeft een vergelijkbare indeling als de 1D-patroonmatrix, behalve dat de patronen nu 2D-gegevens bevatten, en ziet er daarom uit zoals in de volgende afbeelding.

illustratie van een matrix van resources met twee patronen

Deze patroonmatrix bevat drie patronen; elk patroon is 3x5 met twee mipmapniveaus.

Een Texture2DArray gebruiken als een bitmapkubus

Een bitmapkubus is een 2D-patroonmatrix die 6 patronen bevat, één voor elk gezicht van de kubus. Een volledig gevulde patroonkubus ziet eruit als in de volgende afbeelding.

illustratie van een matrix van resources met twee patronen die een patroonkubus vertegenwoordigen

Een 2D-patroonmatrix die 6 patronen bevat, kan worden gelezen vanuit shaders met de intrinsieke functies van de kubuskaart, nadat deze zijn gebonden aan de pijplijn met een weergave met kubuspatroon. Patroonkubussen worden vanuit de shader geadresseerd met een 3D-vector die vanuit het midden van de bitmapkubus wijst.

3D-patroon

Een Texture3D-resource (ook wel volumetextuur genoemd) bevat een 3D-volume van texelen. Omdat het een patroonresource is, kan het mipmap-niveaus bevatten. Een volledig gevulde 3D-patroon ziet er als volgt uit.

illustratie van een 3d-patroonresource

Wanneer een mipmap-segment van een 3D-patroon is gebonden als een renderdoeluitvoer (met een render-doelweergave), gedraagt het 3D-patroon zich identiek aan een 2D-patroonmatrix met n segmenten. Het specifieke rendersegment wordt gekozen uit de geometrie-shaderfase door een scalaire component van uitvoergegevens te declareren als de SV_RenderTargetArrayIndex systeemwaarde.

Er is geen concept van een 3D-patroonmatrix; daarom is een subresource met een 3D-patroon één mipmapniveau.

Subresources

De Direct3D 10-API verwijst naar volledige resources of subsets van resources. Om een deel van de resources op te geven, heeft Direct3D de term subresources bedacht. Dit betekent een subset van een resource.

Een buffer wordt gedefinieerd als één subresource. Texturen zijn iets ingewikkelder omdat er verschillende textuurtypen (1D, 2D, enzovoort) zijn die ondersteuning bieden voor mipmapniveaus en/of bitmapmatrices. Vanaf het eenvoudigste geval wordt een 1D-patroon gedefinieerd als één subresource, zoals wordt weergegeven in de volgende afbeelding.

illustratie van een 1d-patroon

Dit betekent dat de matrix van texels waaruit een 1D-textuur bestaat, zich in één subresource bevindt.

Als u een 1D-patroon met drie mipmapniveaus uitvouwt, kan dit als volgt worden gevisualiseerd.

illustratie van een 1d-patroon met mipmapniveaus

U kunt dit beschouwen als één patroon dat bestaat uit drie subteksten. Elke subtekstuur wordt geteld als een subresource, dus deze 1D-textuur bevat 3 subresources. Een subtekstuur (of subresource) kan worden geïndexeerd met behulp van het lod-niveau (level-of-detail) voor één patroon. Wanneer u een matrix met patronen gebruikt, is voor het openen van een bepaalde subtekst zowel de LOD als het specifieke patroon vereist. De API combineert deze twee stukjes informatie ook in één op nul gebaseerde subresourceindex, zoals hier wordt weergegeven.

illustratie van een subresourceindex op basis van nul

Subresources selecteren

Sommige API's hebben toegang tot een hele resource (bijvoorbeeld CopyResource), andere hebben toegang tot een gedeelte van een resource (bijvoorbeeld UpdateSubresource of CopySubresourceRegion). De API's die toegang hebben tot een gedeelte van een resource, gebruiken doorgaans een weergavebeschrijving (zoals D3D10_TEX2D_ARRAY_DSV) om de subresources op te geven voor toegang.

Deze afbeeldingen illustreren de termen die door een weergavebeschrijving worden gebruikt bij het openen van een matrix met patronen.

Matrixsegment

Op basis van een matrix met patronen bevat elke textuur met mipmaps een matrixsegment (vertegenwoordigd door de witte rechthoek) één patroon en alle subtekstuurs, zoals wordt weergegeven in de volgende afbeelding.

illustratie van een matrix-splice

Mip-segment

Een mip-segment (vertegenwoordigd door de witte rechthoek) bevat één mipmapniveau voor elk patroon in een matrix, zoals wordt weergegeven in de volgende afbeelding.

illustratie van een mip-splice

Eén subresource selecteren

U kunt deze twee typen segmenten gebruiken om één subresource te kiezen, zoals wordt weergegeven in de volgende afbeelding.

illustratie van het kiezen van een subresource met behulp van een matrixsegment en een mip-splice

Meerdere subresources selecteren

U kunt deze twee typen segmenten ook gebruiken met het aantal mipmapniveaus en/of het aantal patronen om meerdere subresources te kiezen.

afbeelding van het kiezen van meerdere subresources

Ongeacht het patroontype dat u gebruikt, met of zonder mipmaps, met of zonder een patroonmatrix, kunt u de helperfunctie D3D10CalcSubresourcegebruiken om de index van een bepaalde subresource te berekenen.

Sterk versus zwak typen

Als u een volledig getypte resource maakt, wordt de resource beperkt tot de indeling waarmee deze is gemaakt. Hierdoor kan de runtime de toegang optimaliseren, met name als de resource wordt gemaakt met vlaggen die aangeven dat deze niet kan worden toegewezen door de toepassing. Resources die zijn gemaakt met een specifiek type, kunnen niet opnieuw worden geïnterpreteerd met behulp van het weergavemechanisme.

In een type minder resource is het gegevenstype onbekend wanneer de resource voor het eerst wordt gemaakt. De toepassing moet kiezen uit het beschikbare type minder indelingen (zie DXGI_FORMAT). U moet de grootte opgeven van het geheugen dat moet worden toegewezen en of de runtime de subteksten in een mipmap moet genereren. De exacte gegevensindeling (of het geheugen wordt geïnterpreteerd als gehele getallen, drijvendekommawaarden, niet-ondertekende gehele getallen, enzovoort) wordt echter pas bepaald als de resource is gebonden aan de pijplijn met een weergave. Omdat de structuurindeling flexibel blijft totdat het patroon is gebonden aan de pijplijn, wordt de resource aangeduid als zwak getypte opslag. Zwak getypte opslag heeft het voordeel dat deze opnieuw kan worden gebruikt of opnieuw kan worden geïnterpreteerd (in een andere indeling), zolang de onderdeelbit van de nieuwe indeling overeenkomt met het aantal bits van de oude indeling.

Eén resource kan worden gebonden aan meerdere pijplijnfasen zolang elk een unieke weergave heeft, die de indelingen op elke locatie volledig in aanmerking komt. Een resource die is gemaakt met de indeling DXGI_FORMAT_R32G32B32A32_TYPELESS kan bijvoorbeeld tegelijkertijd worden gebruikt als een DXGI_FORMAT_R32G32B32A32_FLOAT en een DXGI_FORMAT_R32G32B32A32_UINT op verschillende locaties in de pijplijn.

Resources (Direct3D 10)