Rastreringsregler

Rastreringsregler definierar hur vektordata mappas till rasterdata. Rasterdata fästs på heltalsplatser som sedan gallras och klipps ut (för att rita det minsta antalet bildpunkter) och attribut per pixel interpoleras (från attribut per hörn) innan de skickas till en pixelskuggare.

Det finns flera typer av regler, som beror på vilken typ av primitiv som mappas, samt om data använder multisampling för att minska alias. Följande illustrationer visar hur hörnfallen hanteras.

Triangel rastreringsregler (utan multisampling)

Alla pixelcenter som faller inuti en triangel ritas; en pixel antas vara inuti om den passerar regeln överst till vänster. Regeln överst till vänster är att en pixel mittpunkt definieras att ligga inuti en triangel om den ligger på den övre kanten eller den vänstra kanten av en triangel.

Var:

  • En överkant, är en kant som är exakt vågrät och ovanför de andra kanterna.
  • En vänster kant, är en kant som inte är exakt vågrät och är på vänster sida av triangeln. En triangel kan ha en eller två vänsterkanter.

Regeln överst till vänster ser till att intilliggande trianglar ritas en gång.

Den här bilden visar exempel på bildpunkter som ritas eftersom de antingen ligger i en triangel eller följer regeln överst till vänster.

bild av exempel på triangel rastrering överst till vänster

Bildpunkternas ljus- och mörkgrå täckning visar dem som grupper av bildpunkterna för att ange vilken triangel de är inuti.

Rad rastreringsregler (alias, utan multisampling)

Regler för rad rastrering använder ett diamanttestområde för att avgöra om en linje täcker en pixel. För x-större linjer (linjer med -1 <= lutning <= +1), innehåller diamanttestområdet (visas i fast) den nedre vänstra kanten, nedre högra kanten och det nedre hörnet; diamanten exkluderar (visas prickad) den övre vänstra kanten, övre högra kanten, den övre sladden, det vänstra hörnet och det högra hörnet. En y-major-linje är en rad som inte är en x-major-linje. testdiamantområdet är detsamma som det som beskrivs för x-huvudlinjen, förutom att det högra hörnet också ingår.

Med tanke på diamantområdet täcker en linje en pixel om linjen lämnar pixelns diamanttestområde när den färdas längs linjen från början mot slutet. En linjeremsa beter sig på samma sätt, eftersom den ritas som en sekvens med linjer.

Följande bild visar några exempel.

bild av exempel på aliasrads rastrering

Rad rastreringsregler (antialiaserade, utan multisampling)

En antialiaserad linje rastreras som om det vore en rektangel (med bredd = 1). Rektangeln korsar varandra med ett återgivningsmål som producerar täckningsvärden per pixel, som multipliceras med pixelskuggningsutdata alfakomponenter. Det finns inga fördefinierade antialias vid ritning av linjer på ett flersampelmål för återgivning.

Det anses att det inte finns något enda "bästa" sätt att utföra antialiaserad linjerendering. Direct3D 10 använder den metod som visas i följande bild som riktlinje. Den här metoden härleddes empiriskt och uppvisade ett antal visuella egenskaper som ansågs önskvärda. Maskinvaran behöver inte exakt matcha den här algoritmen. tester mot denna referens ska ha "rimliga" toleranser som styrs av några av de principer som anges nedan, vilket tillåter olika maskinvaruimplementeringar och filterkärnningsstorlekar. Ingen av den här flexibiliteten som tillåts vid maskinvaruimplementering kan dock förmedlas via Direct3D 10 till program, utöver att bara rita linjer och observera/mäta hur de ser ut.

bild av exempel på rastrering av antialiaserade linjer

Den här algoritmen genererar relativt jämna linjer med enhetlig intensitet med minimala ojämna kanter eller fläta. Moire mönster för nära linjer minimeras. Det finns bra täckning för korsningar mellan linjesegment placerade från slutpunkt till slutpunkt. Filterkärnan är en rimlig kompromiss mellan mängden kantsuddning och de intensitetsändringar som orsakas av gammakorrigeringar. Täckningsvärdet multipliceras med pixelskuggning o0.a (srcAlpha) enligt följande formel genom fasen output-merger: srcColor * srcAlpha + destColor * (1-srcAlpha).

Punkt rastreringsregler (utan multisampling)

En punkt tolkas som om den består av två trianglar i ett Z-mönster, som använder triangel rastreringsregler. Koordinaten identifierar mitten av en en pixel bred fyrkant. Det finns ingen skyddsjakt på punkter.

Följande bild visar några exempel.

illustration av exempel på punkt rastrering

Rastreringsregler för flersampling mot alias

Multisample antialiasing (MSAA) minskar geometrialias med hjälp av pixeltäckning och djupstenciltester på flera underexempelplatser. För att förbättra prestanda utförs beräkningar per pixel en gång för varje täckt pixel genom att dela skuggningsutdata mellan täckta underpixlar. Multisample antialiasing minskar inte ytalias. Exempelplatser och återuppbyggnadsfunktioner är beroende av maskinvaruimplementeringen.

Följande bild visar några exempel.

illustration av exempel på multisample antialias rasterization

Antalet exempelplatser är beroende av multisampleläget. Hörnattribut interpoleras vid pixelcentra, eftersom det är här pixelskuggaren anropas (detta blir extrapolering om mitten inte täcks). Attribut kan flaggas i pixelskuggningen som centroidexempel, vilket gör att icke-täckta pixlar interpolerar attributet i skärningspunkten mellan pixelns område och primitiven. En pixelskuggning körs för varje 2x2 bildpunktsområde för att stödja derivatberäkningar (som använder x- och y-deltan). Det innebär att skuggningsanrop sker mer än vad som visas för att fylla i den minsta kvantanten 2x2 (som är oberoende av multisampling). Skuggningsresultatet skrivs ut för varje täckt exempel som klarar djupstenciltestet per prov.

Rastreringsregler för primitiver är i allmänhet oförändrade av multisample antialiasing, förutom:

  • För en triangel utförs ett täckningstest för varje exempelplats (inte för en pixelcenter). Om fler än en exempelplats täcks körs en pixelskuggning en gång med attribut interpolerade i pixelcentret. Resultatet lagras (replikeras) för varje täckt exempelplats i pixeln som klarar djup-/stenciltestet.

    En linje behandlas som en rektangel som består av två trianglar, med en linjebredd på 1,4.

  • För en punkt utförs ett täckningstest för varje exempelplats (inte för en pixelcenter).

Många format stöder flerasamplingar (se Maskinvarustöd för Direct3D 10-format), vissa format kan lösas (ResolveSubresource, som gör ett flersampelformat till en exempelstorlek på 1). Flersamplingsformat kan användas i återgivningsmål som kan läsas tillbaka till skuggningar med hjälp av inläsning, eftersom ingen lösning krävs för enskilda exempel som används av skuggningen. Djupformat stöds inte för flera exempelresurser, därför är djupformat begränsade till endast återgivningsmål.

Typlösa format (R8G8B8A8_TYPELESS till exempel) stöder multisampling så att en resursvy kan tolka data på olika sätt. Du kan till exempel skapa en multisample-resurs med hjälp av R8G8B8A8_TYPELESS, rendera till den med hjälp av en render-target-view-resurs med ett R8G8B8A8_UINT format och sedan matcha innehållet till en annan resurs med ett R8G8B8A8_UNORM dataformat.

Maskinvarusupport

API:et rapporterar maskinvarustöd för flerasamplingar genom antalet kvalitetsnivåer. Till exempel innebär en kvalitetsnivå på 0 att maskinvaran inte stöder flerasamplingar (på ett visst format och en viss kvalitetsnivå). En 3 för kvalitetsnivåer innebär att maskinvaran stöder tre olika exempellayouter och/eller matchningsalgoritmer. Du kan också anta följande:

  • Alla format som stöder multisampling stöder samma antal kvalitetsnivåer för varje format i den familjen.
  • Varje format som stöder multisampling och har formaten _UNORM, _SRGB, _SNORM eller _FLOAT stöder också matchning.

Centroidsampling av attribut vid Multisample Antialiasing

Som standard interpoleras hörnattribut till en pixelcenter under flersampling av antialias. Om pixelcentret inte täcks extrapoleras attributen till en pixelcenter. Om en pixelskuggningsindata som innehåller centroid-semantiken (förutsatt att pixeln inte är helt täckt) kommer att samplas någonstans inom pixelns täckta område, eventuellt på någon av de täckta exempelplatserna. En exempelmask (som anges av rastreringstillståndet) tillämpas före centroidberäkning. Därför används inte ett utmaskerat exempel som centroidplats.

Referens rasterizern väljer en exempelplats för centroidsampling som liknar detta:

  • Exempelmasken tillåter alla exempel. Använd en pixel mittpunkt om pixeln är täckt eller om inget av exemplen omfattas. Annars väljs det första täckta exemplet, med början från pixelns mittpunkt och utåt.
  • Exempelmasken inaktiverar alla exempel utom ett (ett vanligt scenario). Ett program kan implementera supersampling med multipass genom att cykla genom enbits sample-mask-värden och återrendera scenen för varje exempel med hjälp av centroidsampling. Detta skulle kräva att ett program justerar derivat för att välja lämpligare textur mips för högre texture sampling densitet.

Derivatberäkningar vid multisampling

Pixelskuggare körs alltid med ett minsta 2x2 pixelområde för att stödja härledda beräkningar, som beräknas genom att ta delta mellan data från intilliggande bildpunkter (vilket gör antagandet att data i varje pixel har samplats med enhetsavstånd vågrätt eller lodrätt). Detta påverkas inte av multisampling.

Om derivat begärs på ett attribut som har samplats centroid justeras inte maskinvaruberäkningen, vilket kan orsaka felaktiga derivat. En skuggning förväntar sig en enhetsvektor i render-målutrymme men kan få en icke-enhetsvektor med avseende på något annat vektorutrymme. Därför är det ett programs ansvar att vara försiktig när man begär derivat från attribut som samplas med centroider. I själva verket rekommenderar vi att du inte kombinerar derivat och centroid sampling. Centroidsampling kan vara användbart för situationer där det är viktigt att en primitivs interpolerade attribut inte extrapoleras, men detta kommer med kompromisser som attribut som verkar hoppa där en primitiv kant korsar en pixel (i stället för att ändras kontinuerligt) eller derivat som inte kan användas av texturens samplingsåtgärder som härleder LOD.

Rasterizer Stage