Direct3D 11

Den aktuella versionen av sidan har ännu inte granskats av erfarna bidragsgivare och kan skilja sig väsentligt från versionen som granskades den 2 november 2014; kontroller kräver 34 redigeringar .

Direct3D 11 (D3D11) är en komponent i applikationsprogrammeringsgränssnittet ( API ) för  DirectX 11, den 11:e versionen av Direct3D , efterföljaren till Direct3D 10/10.1 . Direct3D 11 tillhandahåller funktioner för operativsystem och applikationer för att interagera med grafikkortsdrivrutiner . Dessa funktioner är inte knutna till nästa operativsystem i Windows-serien ( Windows 7 ) och är tillgängliga i Windows Vista . Delvis fungerar D3D11 på grafikkort på Direct3D 9-10 nivå.

De första förhandsversionerna dök upp i november 2008. Den officiella slutliga versionen släpptes den 22 oktober 2009 som en del av Windows 7 . Den 28 oktober 2009 blev DirectX 11 officiellt tillgänglig för Windows Vista och Windows Server 2008 via nedladdning via Windows Update . [ett]

Tessellation

D3D11 lägger till 3 ytterligare steg till renderingspipelinen, vars syfte är att effektivt tessellate ytor.

D3D11-pipelinen inkluderar tre nya steg mellan vertex- och geometriskuggningsstegen . Två av dem är programmerbara (skrovskuggnings- och domänskuggningssteg) och en är konfigurerbar (tesselationssteg).

Den presenterade pipelinen arbetar med rutnät som definieras av ytfläckar. De viktigaste primitiverna för D3D11 är triangulära och fyrkantiga fläckar. Formen på varje lapp bestäms av antalet kontrollpunkter. I vertex-skuggningen omvandlas dessa punkter, skalas och/eller förvandlas sekventiellt.

Skalshadern kallas för varje lapp. Patch brytpunkter från vertex shader används som indata. Skalshadern har två huvudsakliga användningsområden. Den första (valfritt) är att konvertera brytpunkter från en representation till en annan. Till exempel låter det dig implementera metoden som presenteras i Approximating Catmull-Clark Subdivision Surfaces with Bicubic Patches . Efter denna shader skickas kontrollpunkterna direkt vidare, förbi tesselatorn. En annan användning är beräkningen av en lämplig tessellationsparameter, som sedan skickas till tessellationsstadiet. Detta tillvägagångssätt tillåter adaptiv tessellation, som kan användas i fallet med vyberoende detaljnivåer (LOD). Tessellationsparametern definieras för varje yta av lappen och sträcker sig från 2 till 64. Detta betyder att varje yta av en triangulär (eller fyrkantig) lapp kan delas upp i 2 (eller maximalt 64) ytor.

Tesselatorsteget representeras av en fast uppsättning funktioner (mycket konfigurerbara) som använder tessellationsparametern för att dela upp lappen i flera trianglar eller quads. Tessellatorn har inte tillgång till brytpunkter - alla uppdelningsbeslut fattas baserat på konfiguration och tessellationsparametrar som skickas från skalskuggningen. Varje vertex efter tessellationssteget skickas till domänskuggningen och endast parameteriseringskoordinater skickas.

Domänskuggningen arbetar på patchens parametriseringskoordinater för varje vertex separat, även om det är möjligt att komma åt de transformerade kontrollpunkterna för hela patchen. Domänskuggningen skickar all information om vertexet (position, texturkoordinater, etc.) till geometriskuggningen (eller till klippningsstadiet om ingen geometriskuggning är angiven). I huvudsak utvärderar den representationen av ytan vid varje punkt. I detta skede kan förskjutningskartläggningsmetoden tillämpas.

Beräkna shaders och oordnat minne

Direct3D 11 introducerar en ny shader-typ, Compute Shader. Beräkningsskuggningen kallas som en vanlig uppsättning trådar. Strömmar är indelade i grupper. Varje grupp har 32 KB minne delat mellan trådarna i gruppen. Således kan trådarna i gruppen dela resultat, vilket förbättrar deras prestanda. Trådar kan också utföra läsningar och skrivningar med slumpmässig tillgång till grafiska resurser: texturer, vertexmatriser, renderingsmål. Dessa minnesåtkomster är oordnade, även om olika instruktioner synkroniseras vid behov.

Pixel (fragment) shaders kan också läsa på en godtycklig adress, vilket gör att datastrukturer kan skrivas som sedan kan användas i en compute shader, eller vice versa. Det är värt att notera att pixelshaders alltid har haft slumpmässig läsåtkomst genom texturuppslagningar.

Compute shaders kan också utföra operationer som summerade area-tabeller, snabba Fourier-transformationer mycket snabbare än tidigare använda metoder på GPU:n. För tillfället undersöker Microsoft bibliotek som tillhandahåller sådana beräkningar. Microsoft tror att algoritmer som A-buffertrendering och ray tracing också kan implementeras effektivt, men för närvarande finns det inga verkliga bevis för deras effektivitet.

Att anropa en beräkningsskuggning ersätter alla steg i renderingspipelinen. Det är dock möjligt att blanda beräkningsskuggningar och traditionell rendering genom att använda deras resultat. Till exempel bildbehandling efter rendering med en datorskuggning (du kan ladda ytterligare datastrukturer).

Flertrådsrendering

D3D10 tillåter endast att renderingskommandon skickas från en enda tråd (det finns för närvarande ett speciellt flertrådsläge, men på grund av dålig prestanda rekommenderar Microsoft inte att du använder det). Som du vet innebär sändning av visualiseringskommandon genom Direct3D användning av ytterligare CPU- beräkningsresurser . Med tanke på trenden att öka antalet CPU-kärnor, introduceras stöd för mer avancerad multithreading för att fördela detta arbete mellan flera trådar och därigenom producera det mer effektivt.

Direct3D 11 gör det möjligt att skapa visningslistor från flera trådar och exekvera dem från huvudrenderingstråden. Dessutom har enheten som skapar resurserna tagits bort från sammanhanget som skickar renderingskommandon. Detta gör att resurser kan skapas asynkront. Uppskjutna kontexter används för att skapa visningslistor och omedelbar kontext används för att skicka renderingskommandon till GPU :n , inklusive hantering av visningslistor som skapats i uppskjutna sammanhang.

Till skillnad från andra funktioner implementeras flertrådsrendering i Direct3D 11 programmatiskt via drivrutinen. Lämpliga D3D10-drivrutiner (kanske till och med D3D9) möjliggör flertrådig rendering mycket mer effektivt än tidigare. En viss nivå av multithreading kommer att vara tillgänglig även utan nya drivrutiner, men det är ännu inte klart vilka begränsningar som kommer att vara i det här fallet.

Andra funktioner

Stöd för dynamisk länkning av shaders (liknande Cg). Detta gör att du kan separera skrivning och sammanställning av ljus- och materialskuggningar. Sen bindning görs när shadern är exponerad. Detta tillvägagångssätt är en lösning på det kombinatoriska explosionsproblemet i fallet med olika ljuskällor och material (det och några andra problem diskuteras i avsnitt 7.9 i Real-Time Rendering, 3:e upplagan )

Två nya komprimerade texturformat har lagts till. BC6 stöder det breda dynamiska området av RGB-texturer med 1 byte per texel (istället för 6 byte för 6-bitars RGB-verkliga texturer). BC7 stöder RGB- eller RGBA-texturer med smalt dynamiskt omfång. Den använder också 1 byte per texel (som DXT5/BC3), men ger betydligt bättre kvalitet än D3D10-texturformaten. Båda nya formaten använder flera blocktyper - komprimeringsverktyget väljer lämplig blocktyp baserat på dess innehåll.

D3D9- och D3D10-komprimeringsblocksformaten är baserade på idén att varje 4×4-block av texel innehåller alla sina värden på en enda rad, och bitarna i varje texel kodar en position på den raden. Till exempel i DXT1/BC1 representerar en linje i RGB-utrymmet två RGB-slutpunkter, och varje texel använder två bitar för att indikera vilken färg som används från de fyra punkterna längs linjen.

De nya D3D11-formaten stöder blocktyper med en, två och till och med tre (i fallet med BC7) färglinjer. Det finns en avvägning mellan antalet rader och antalet punkter längs en sådan linje, eftersom varje block upptar samma mängd minne. I grund och botten kräver ett 4×4-block med två färglinjer ytterligare 16 bitar per block för att specificera vilken linje av varje texel som var associerad med det (i fallet med tre färglinjer skulle ännu fler bitar behövas). För att minska minneskraven stöds endast en liten uppsättning möjliga färglinjemönster. För varje block väljer paketeringsverktyget det bästa alternativet från den delmängden.

Direct3D 11 har en stramare texturspecifikation. Dekompressionsresultaten måste vara korrekta och subtexel/submip-filtrering måste vara minst 8 bitar korrekt.

Direct3D 11 låter dig använda texturer som har en maximal storlek i intervallet 8K-16K texel. Observera att en 16K x 16K DXT1/BC1 textur är 128MB - inte många spel kommer att använda så stora texturer, men det kan vara lämpligt för tekniker som megatexture . I allmänhet kan en resurs nu vara upp till 2 GB stor i D3D11.

Hårdvaran kan eventuellt stödja reella flyttal med dubbel precision.

Gamefest 2008 innehöll också en bild med många andra nya funktioner, vars detaljer inte förklarades:

DirectX 11 och hanterad kod

SlimDX och SharpDX stöder DirectX 11. XNA  - nr

Spelmotorer med DirectX 11-stöd

Se även


Anteckningar

  1. Andrew Burnes. DirectX 11 släppt för Windows Vista  . Voodoo Extreme 3D (28 oktober 2009). Hämtad 29 oktober 2009. Arkiverad från originalet 17 mars 2012.
  2. Battlefield Bad Company 2 med DirectX 11-stöd . GameTech (16 april 2009). Hämtad 1 november 2009. Arkiverad från originalet 17 mars 2012.

Länkar