Delen via


Output-Merger fase

De uitvoer-fusiefase (OM) genereert de uiteindelijke weergegeven pixelkleur met behulp van een combinatie van pijplijnstatus, de pixelgegevens die worden gegenereerd door de pixel-shaders, de inhoud van de renderdoelen en de inhoud van de diepte-/stencilbuffers. De OM-fase is de laatste stap voor het bepalen welke pixels zichtbaar zijn (met diepte-stenciltests) en het combineren van de uiteindelijke pixelkleuren.

Verschillen tussen Direct3D 9 en Direct3D 10:

  • Direct3D 9 implementeert alfatests (met behulp van alfateststatus) om te bepalen of een pixel naar een uitvoerweergavedoel wordt geschreven.
  • Direct3D 10 en hoger implementeert geen alfatest (of alfateststatus). Dit kan worden beheerd met behulp van een pixel-shader of met diepte-/stencilfunctionaliteit.

Overzicht van Depth-Stencil testen

Een dieptestencilbuffer, die wordt gemaakt als een patroonresource, kan zowel dieptegegevens als stencilgegevens bevatten. De dieptegegevens worden gebruikt om te bepalen welke pixels het dichtst bij de camera liggen en de stencilgegevens worden gebruikt om te maskeren welke pixels kunnen worden bijgewerkt. Uiteindelijk worden zowel de diepte- als de stencilwaarden gebruikt door de fase uitvoerfusie om te bepalen of een pixel moet worden getekend of niet. In het volgende diagram ziet u conceptueel hoe dieptestenciltests worden uitgevoerd.

diagram van hoe dieptestenciltests werken

Zie Configureren van Depth-Stencil Functionaliteitvoor het configureren van dieptestencils. Een diepte-stencilobject bevat de status van het diepte-stencil. Een toepassing kan de status van het dieptestencil opgeven of de OM-fase gebruikt standaardwaarden. Mengbewerkingen worden per pixel uitgevoerd als multisampling is uitgeschakeld. Als multisampling is ingeschakeld, vindt blending plaats per multisample basis.

Het proces van het gebruik van de dieptebuffer om te bepalen welke pixel moet worden getekend, wordt dieptebuffering genoemd, ook wel z-buffering genoemd.

Zodra dieptewaarden de uitvoer-fusiefase bereiken (ongeacht of ze afkomstig zijn van interpolatie of van een pixel-shader), worden ze altijd vastgemaakt: z = min(Viewport.MaxDepth,max(Viewport.MinDepth,z)) volgens de indeling/precisie van de dieptebuffer, met behulp van regels voor drijvende komma. Na het vastklemmen wordt de dieptewaarde vergeleken (met behulp van DepthFunc) tegen de bestaande dieptebufferwaarde. Als er geen dieptebuffer is gebonden, wordt de dieptetest altijd doorgegeven.

Als er geen stencilonderdeel in de dieptebufferindeling of geen dieptebuffer is gebonden, wordt de stenciltest altijd doorgegeven. Anders blijft de functionaliteit ongewijzigd ten laste van Direct3D 9.

Slechts één diepte-/stencilbuffer kan tegelijk actief zijn; elke afhankelijke resourceweergave moet overeenkomen met de diepte-/stencilweergave (dezelfde grootte en dimensies). Dit betekent niet dat de resourcegrootte moet overeenkomen, alleen dat de weergavegrootte moet overeenkomen.

Zie zelfstudie 14voor meer informatie over het testen van dieptestencils.

Overzicht van blending

Combineren combineert een of meer pixelwaarden om een uiteindelijke pixelkleur te maken. In het volgende diagram ziet u het proces voor het combineren van pixelgegevens.

diagram van de werking van het combineren van gegevens

Conceptueel gezien kunt u dit stroomdiagram visualiseren dat twee keer wordt geïmplementeerd in de fase van de uitvoerfusie: de eerste combineert RGB-gegevens, terwijl tegelijkertijd een tweede stroomdiagram alfagegevens combineert. Zie Blending Functionality configurerenvoor meer informatie over het gebruik van de API om de blendstatus te maken en in te stellen.

Blend met vaste functies kan onafhankelijk van elkaar worden ingeschakeld voor elk renderdoel. Er is echter slechts één set blend-besturingselementen, zodat dezelfde blend wordt toegepast op alle RenderTargets waarvoor blending is ingeschakeld. Blend-waarden (inclusief BlendFactor) worden altijd vastgeklemd in het bereik van de render-doelindeling voordat u mengt. Het vastklemmen wordt uitgevoerd per renderdoel, waarbij het doeltype van de render wordt gerespecteerd. De enige uitzondering hierop is voor de float16-, float11- of float10-indelingen die niet zijn vastgeklemd, zodat mengbewerkingen op deze indelingen kunnen worden uitgevoerd met ten minste gelijke precisie/bereik als uitvoerindeling. NaN's en ondertekende nullen worden doorgegeven voor alle gevallen (inclusief 0,0 mengselgewichten).

Wanneer u sRGB-renderdoelen gebruikt, converteert de runtime de doelkleur van de render naar lineaire ruimte voordat het mengt. De runtime converteert de uiteindelijke gemengde waarde terug naar sRGB-ruimte voordat de waarde weer wordt opgeslagen in het renderdoel.

Verschillen tussen Direct3D 9 en Direct3D 10:

  • In Direct3D 9 kan het combineren van vaste functies onafhankelijk worden ingeschakeld voor elk renderdoel.
  • In Direct3D 10 en hoger is er één beschrijving van de blend-state; Daarom kan één blending-waarde worden ingesteld voor alle renderdoelen.

Dual-Source kleurmenging

Met deze functie kan de uitvoer-fusiefase tegelijkertijd zowel pixel-shader-uitvoer (o0 als o1) gebruiken als invoer voor een mengbewerking met het doel voor één render op sleuf 0. Geldige mengbewerkingen zijn onder andere: optellen, aftrekken en opnieuw aftrekken. Geldige blendopties voor SrcBlend, DestBlend, SrcBlendAlpha of DestBlendAlpha zijn onder andere: D3D11_BLEND_SRC1_COLOR, D3D11_BLEND_INV_SRC1_COLOR, D3D11_BLEND_SRC1_ALPHA, D3D11_BLEND_INV_SRC1_ALPHA. De combinatievergelijking en het schrijfmasker voor uitvoer geven aan welke onderdelen de pixel-shader uitvoert. Extra onderdelen worden genegeerd.

Schrijven naar andere pixel-shader-uitvoer (o2, o3 enzovoort) is niet gedefinieerd; u mag niet schrijven naar een renderdoel als deze niet is gebonden aan site 0. Het schrijven van oDepth is geldig tijdens het combineren van dubbele bronkleuren.

Zie voor voorbeelden het combineren van pixel-shader-uitvoer.

Overzicht van meerdere RenderTargets

Een pixel-shader kan worden gebruikt om ten minste 8 afzonderlijke renderdoelen weer te geven, die allemaal hetzelfde type moeten zijn (buffer, Texture1D, Texture1DArray, enzovoort). Bovendien moeten alle renderdoelen dezelfde grootte hebben in alle dimensies (breedte, hoogte, diepte, matrixgrootte, steekproefaantallen). Elk renderdoel kan een andere gegevensindeling hebben.

U kunt elke combinatie van renderdoelensites (maximaal 8) gebruiken. Een resourceweergave kan echter niet tegelijkertijd worden gebonden aan meerdere render-target-slots. Een weergave kan opnieuw worden gebruikt zolang de resources niet tegelijkertijd worden gebruikt.

Overzicht van Output-Write masker

Gebruik een uitvoer-schrijfmasker om te bepalen welke gegevens naar een renderdoel kunnen worden geschreven (per onderdeel).

Overzicht van voorbeeldmasker

Een voorbeeldmasker is een 32-bits multisample dekkingsmasker dat bepaalt welke voorbeelden worden bijgewerkt in actieve renderdoelen. Er is slechts één voorbeeldmasker toegestaan. De toewijzing van bits in een voorbeeldmasker aan de voorbeelden in een resource wordt gedefinieerd door een gebruiker. Voor n-sample rendering worden de eerste n bits (van de LSB) van het voorbeeldmasker gebruikt (32 bits het maximum aantal bits).

In deze sectie

Onderwerp Beschrijving
Depth-Stencil Functionaliteit configureren
In deze sectie worden de stappen beschreven voor het instellen van de dieptestencilbuffer en de status van het dieptestencil voor de fase van de uitvoerfusie.
Blending Functionality configureren
Mengbewerkingen worden uitgevoerd op elke pixel-shader-uitvoer (RGBA-waarde) voordat de uitvoerwaarde naar een renderdoel wordt geschreven. Als multisampling is ingeschakeld, wordt blending uitgevoerd op elke multisample; anders wordt blending op elke pixel uitgevoerd.
diepte-
Veelhoeken die coplanar zijn in 3D-ruimte, kunnen worden gemaakt alsof ze niet coplanar zijn door een z-bias (of diepte-bias) toe te voegen aan elke ruimte.

Graphics Pipeline-

pijplijnfasen (Direct3D 10)