Delen via


Stencilbuffers

Een stencilbuffer wordt gebruikt om pixels in een afbeelding te maskeren om speciale effecten te produceren. Het masker bepaalt of de pixel al dan niet wordt getekend. Deze speciale effecten omvatten compositing; stickeren; doezelen, vervagen en vegen; contouren en silhouetten; en tweezijdige stencils. Hieronder ziet u enkele van de meest voorkomende effecten.

Met de stencilbuffer kan het tekenen naar het renderdoeloppervlak op pixel-voor-pixelbasis worden in- of uitgeschakeld. Op het meest fundamentele niveau kunnen toepassingen secties van de gerenderde afbeelding maskeren, zodat ze niet worden weergegeven. Toepassingen gebruiken vaak stencilbuffers voor speciale effecten, zoals het oplossen van beelden, decals en omlijning.

Informatie van de stencilbuffer is ingebed in de z-buffergegevens.

De werking van de stencilbuffer

Direct3D voert een test uit op de inhoud van de stencilbuffer op pixelbasis. Voor elke pixel in het doeloppervlak wordt een test uitgevoerd met behulp van de bijbehorende waarde in de stencilbuffer, een stencilreferentiewaarde en een stencilmaskerwaarde. Als de test is geslaagd, voert Direct3D een actie uit. De test wordt uitgevoerd met behulp van de volgende stappen.

  1. Voer een bitsgewijze AND-bewerking uit van de stencilreferentiewaarde met het stencilmasker.
  2. Voer een bitsgewijze AND-operatie uit op de stencilbufferwaarde voor de huidige pixel met het stencilmasker.
  3. Vergelijk het resultaat van stap 1 met het resultaat van stap 2, met behulp van de vergelijkingsfunctie.

De bovenstaande stappen worden weergegeven in de volgende coderegel:

(StencilRef & StencilMask) CompFunc (StencilBufferValue & StencilMask)
  • StencilRef vertegenwoordigt de referentiewaarde van het stencil.
  • StencilMask vertegenwoordigt de waarde van het stencilmasker.
  • CompFunc is de vergelijkingsfunctie.
  • StencilBufferValue is de inhoud van de stencilbuffer voor de huidige pixel.
  • Het en-teken (&) vertegenwoordigt de bitsgewijze AND-bewerking.

De huidige pixel wordt naar het doeloppervlak geschreven als de stenciltest slaagt, en anders genegeerd. Het standaardvergelijkingsgedrag is het schrijven van de pixel, ongeacht hoe elke bitsgewijze bewerking blijkt. U kunt dit gedrag wijzigen door de waarde van een geïnventariseerd type te wijzigen om de gewenste vergelijkingsfunctie te identificeren.

Uw toepassing kan de werking van de stencilbuffer aanpassen. Hiermee kunt u de vergelijkingsfunctie, het stencilmasker en de stencil-verwijzingswaarde instellen. Het kan ook bepalen welke actie Direct3D uitvoert wanneer de stenciltest is geslaagd of mislukt.

samengestelde beelden

Uw toepassing kan de stencilbuffer gebruiken voor samengestelde 2D- of 3D-afbeeldingen op een 3D-scène. Een masker in de stencilbuffer wordt gebruikt om een gebied van het renderingdoeloppervlak af te sluiten. Opgeslagen 2D-gegevens, zoals tekst of bitmaps, kunnen vervolgens naar het onderbroken gebied worden geschreven. Uw toepassing kan alternatief extra 3D-primitieven weergeven op het door de stencil gemaskeerde gebied van het renderingdoeloppervlak. Het kan zelfs een hele scène weergeven.

Games maken vaak meerdere 3D-scènes samen. Rijspellen geven bijvoorbeeld meestal een spiegel aan de achterzijde weer. De spiegel bevat de weergave van de 3D-scène achter de driver. Het is in feite een tweede 3D-scène die is samengesteld met het vooraanzicht van de bestuurder.

Stickeren

Direct3D-toepassingen gebruiken schaalaanpassing om te bepalen welke pixels van een bepaalde primitieve afbeelding worden getekend op het renderingdoeloppervlak. Toepassingen brengen decals aan op de afbeeldingen van primitieven om coplanaire veelhoeken correct weer te geven.

Wanneer u bijvoorbeeld bandenmarkeringen en gele lijnen toepast op een weg, moeten de markeringen direct boven op de weg worden weergegeven. De z-waarden van de markeringen en de weg zijn echter hetzelfde. Daarom kan de dieptebuffer geen schone scheiding tussen de twee produceren. Sommige pixels in het achterste element kunnen boven op het voorste element worden weergegeven en omgekeerd. De resulterende afbeelding lijkt van frame naar frame te shimmeren. Dit effect wordt z-fighting of flikkerengenoemd.

Als u dit probleem wilt oplossen, gebruikt u een stencil om het deel van de achterzijde van de primitie te maskeren waar de decal zal verschijnen. Schakel z-buffering uit en render de afbeelding van het voorste object in het gemaskeerde gebied van het renderdoeloppervlak.

Hoewel meerdere textuurmixen kunnen worden gebruikt om dit probleem op te lossen, beperkt u hiermee het aantal andere speciale effecten dat uw toepassing kan produceren. Als u de stencilbuffer gebruikt om decals toe te passen, komen textuurmixfasen vrij voor andere effecten.

opgelost, vervaagt en veegt

Toepassingen maken steeds vaker gebruik van speciale effecten die vaak worden gebruikt in films en video's, zoals oplossen, swipen en vervagen.

Bij een overvloeien wordt één afbeelding geleidelijk vervangen door een andere in een vloeiende reeks beelden. Hoewel Direct3D methoden biedt voor het gebruik van meerdere textuurmengingen om hetzelfde effect te bereiken, kunnen toepassingen die de stencilbuffer gebruiken voor overgangen, de mogelijkheden van textuurmenging voor andere effecten benutten terwijl ze een overgang uitvoeren.

Wanneer uw toepassing een overvloeieffect uitvoert, moeten er twee verschillende afbeeldingen worden weergegeven. De stencilbuffer wordt gebruikt om te bepalen welke pixels van elke afbeelding worden getekend op het renderingdoeloppervlak. U kunt een reeks stencilmaskers definiëren en deze kopiëren naar de stencilbuffer op opeenvolgende frames. U kunt ook een basisstencilmasker voor het eerste frame definiëren en dit stapsgewijs wijzigen.

Aan het begin van het overvloeieffect configureert uw toepassing de stencilfunctie en het stencilmasker, zodat de meeste pixels van de beginafbeelding de stenciltest doorstaan. De meeste pixels van de eindafbeelding moeten de stenciltest mislukken. Bij opeenvolgende frames wordt het stencilmasker bijgewerkt, zodat minder en minder pixels in de beginafbeelding de test doorstaan. Naarmate de frames vordert, mislukken minder en minder van de pixels in de eindafbeelding de test. Op deze manier kan uw toepassing een oplossing uitvoeren met behulp van een willekeurig oplossingspatroon.

In vervagen of uit vervagen is een speciaal geval van overvloeien. Bij het vervagen wordt de stencilbuffer gebruikt om over te gaan van een zwarte of witte afbeelding naar een weergave van een 3D-scène. Vervagen is het tegenovergestelde; je applicatie begint met een rendering van een 3D-scène en vervaagt naar zwart of wit. De fade kan worden uitgevoerd met elk willekeurig patroon dat u wilt gebruiken.

Direct3D-toepassingen gebruiken een vergelijkbare techniek voor veegbewegingen. Wanneer een toepassing bijvoorbeeld een veegbeweging van links naar rechts uitvoert, wordt de eindafbeelding geleidelijk over de beginafbeelding van links naar rechts geschoven. Net als bij een dissolve moet u een reeks stencilmaskers definiëren die in de stencilbuffer op opeenvolgende frames worden geladen, of het beginstencilmasker steeds verder aanpassen. De stencilmaskers worden gebruikt om het schrijven van pixels uit de beginafbeelding uit te schakelen en het schrijven van pixels vanaf de eindafbeelding in te schakelen.

Een veegbeweging is iets complexer dan een overgang, aangezien uw toepassing pixels moet lezen van de eindafbeelding in de omgekeerde richting van de veegbeweging. Als de veegbeweging van links naar rechts gaat, moet uw toepassing pixels van de eindafbeelding van rechts naar links lezen.

contouren en silhouetten

U kunt de stencilbuffer gebruiken voor abstractere effecten, zoals overzicht en silhouetting.

Als uw toepassing een stencilmasker toepast op de afbeelding van een primitieve die dezelfde vorm is, maar iets kleiner, bevat de resulterende afbeelding alleen de omtrek van de primitieve. De toepassing kan vervolgens het stencilgemaskeerde gebied van de afbeelding vullen met een effen kleur, waardoor het primitieve element een reliëf uitstraling krijgt.

Als het stencilmasker dezelfde grootte en vorm heeft als het primitief dat u weergeeft, bevat de resulterende afbeelding een gat waar het primitief zou moeten zijn. Uw toepassing kan het gat vervolgens vullen met zwart om een silhouet van de primitieve te produceren.

tweezijdig stencil

Schaduwvolumes worden gebruikt voor het tekenen van schaduwen met de stencilbuffer. De toepassing berekent de schaduwvolumes die door afschermende geometrie worden gegoten, door de silhouetranden te berekenen en ze weg van het licht te extruderen in een reeks 3D-volumes. Deze volumes worden vervolgens twee keer weergegeven in de stencilbuffer.

De eerste render plaatst voorwaarts gerichte polygonen en verhoogt de waarden in de stencilbuffer. Bij de tweede rendering worden de achterwaarts gerichte veelhoeken van het schaduwvolume getekend en worden de waarden in de stencilbuffer verlaagd. Normaal gesproken annuleren alle incrementele en aflopende waarden elkaar. De scène is echter al weergegeven met normale geometrie, waardoor sommige pixels de z-buffertest mislukken omdat het schaduwvolume wordt weergegeven. Waarden die in de stencilbuffer zijn achtergebleven, komen overeen met pixels die zich in de schaduw bevinden. Deze resterende inhoud van een stencilbuffer wordt gebruikt als masker om een grote, allesomvattende zwarte quad in de scène te combineren. Met de stencilbuffer die als masker fungeert, is het resultaat om pixels die zich in de schaduwen bevinden, donkerder te maken.

Dit betekent dat de schaduwgeometrie twee keer per lichtbron wordt getekend, waardoor de druk op de hoekpuntdoorvoer van de GPU wordt gelegd. De tweezijdige stencilfunctie is ontworpen om deze situatie te verhelpen. Bij deze benadering zijn er twee sets stencil-status (hieronder genoemd), één set voor de voorwaarts gerichte driehoeken en de andere voor de achterwaarts gerichte driehoeken. Op deze manier wordt per schaduwvolume slechts één pas getekend, per licht.

Diepte- en Stencilbuffers