Delen via


Dieptebuffers (Direct3D 9)

Een dieptebuffer, ook wel een z-buffer of een w-buffer genoemd, is een eigenschap van het apparaat waarin dieptegegevens worden opgeslagen die door Direct3D moeten worden gebruikt. Wanneer Direct3D een scène naar een doeloppervlak weergeeft, kan het geheugen in een gekoppeld dieptebufferoppervlak als werkruimte worden gebruikt om te bepalen hoe de pixels van gerasterde veelhoeken elkaar afzetten. Direct3D maakt gebruik van een Direct3D-oppervlak buiten het scherm als doel waarnaar uiteindelijke kleurwaarden worden geschreven. Het dieptebufferoppervlak dat is gekoppeld aan het render-doeloppervlak wordt gebruikt om dieptegegevens op te slaan die Direct3D vertellen hoe diep elke zichtbare pixel zich in de scène bevindt.

Wanneer een scène wordt gerasterd met dieptebuffering ingeschakeld, wordt elk punt op het renderingoppervlak getest. De waarden in de dieptebuffer kunnen de z-coördinaat van een punt of de homogene w-coördinaat zijn, vanaf de locatie van het punt (x,y,z,w) in de projectieruimte. Een dieptebuffer die z-waarden gebruikt, wordt vaak een z-buffer genoemd en een buffer die w-waarden gebruikt, wordt een w-buffer genoemd. Elk type dieptebuffer heeft voor- en nadelen, die later worden besproken.

Aan het begin van de test wordt de dieptewaarde in de dieptebuffer ingesteld op de grootst mogelijke waarde voor de scène. De kleurwaarde op het renderingoppervlak is ingesteld op de achtergrondkleurwaarde of de kleurwaarde van de achtergrondtextuur op dat moment. Elke veelhoek in de scène wordt getest om te zien of deze met de huidige coördinaat (x,y) op het renderingoppervlak wordt gekruist. Als dat het geval is, wordt de dieptewaarde - die de z-coördinaat in een z-buffer is en de w-coördinaat in een w-buffer - op het huidige punt getest om te zien of deze kleiner is dan de dieptewaarde die is opgeslagen in de dieptebuffer. Als de diepte van de polygoonwaarde kleiner is, wordt deze opgeslagen in de dieptebuffer en wordt de kleurwaarde van de veelhoek naar het huidige punt op het renderingoppervlak geschreven. Als de dieptewaarde van de veelhoek op dat punt groter is, wordt de volgende veelhoek in de lijst getest. Dit proces wordt weergegeven in het volgende diagram.

diagram van het testen van dieptewaarden

Notitie

Hoewel de meeste toepassingen deze functie niet gebruiken, kunt u de vergelijking wijzigen die Direct3D gebruikt om te bepalen welke waarden in de dieptebuffer worden geplaatst en vervolgens het render-doeloppervlak. Hiervoor wijzigt u de waarde voor de D3DRS_ZFUNC weergavestatus. Op sommige hardware kan het wijzigen van de vergelijkingsfunctie hiërarchische z-tests uitschakelen.

 

Bijna alle accelerators op de markt ondersteunen z-buffering, waardoor z-buffers tegenwoordig het meest voorkomende type dieptebuffer zijn. Maar alomtegenwoordige z-buffers hebben hun nadelen. Vanwege de betrokken wiskunde worden de gegenereerde z-waarden in een z-buffer meestal niet gelijkmatig verdeeld over het z-bufferbereik (meestal 0,0 tot 1,0, inclusief). Met name de verhouding tussen de ver- en bijna-knipvlakken is sterk van invloed op hoe ongelijkmatige z-waarden worden verdeeld. Met behulp van een verre vlakafstand tot bijna-vlakafstandsverhouding van 100, wordt 90 procent van het dieptebufferbereik besteed aan de eerste 10 procent van het dieptebereik van de scène. Typische toepassingen voor entertainment of visuele simulaties met buitenscènes vereisen vaak vervlak-/bijna-vlakverhoudingen tussen 1000 en 10.000. Bij een verhouding van 1.000 wordt 98 procent van het bereik besteed aan de eerste 2 procent van het dieptebereik en wordt de verdeling slechter met hogere verhoudingen. Dit kan leiden tot verborgen oppervlakartefacten in verre objecten, met name wanneer u 16-bits dieptebuffers gebruikt, de meest ondersteunde bitdiepte.

Een w-gebaseerde dieptebuffer daarentegen wordt vaak gelijkmatiger verdeeld tussen de near- en far clipvlakken dan een z-buffer. Het belangrijkste voordeel is dat de verhouding tussen afstanden voor de ver- en bijna-knipvlakken geen probleem meer is. Hierdoor kunnen toepassingen grote maximumbereiken ondersteunen, terwijl ze nog steeds relatief nauwkeurige dieptebuffering dicht bij het oogpunt krijgen. Een dieptebuffer op basis van w is niet perfect en kan soms verborgen oppervlakartefacten voor bijna-objecten vertonen. Een ander nadeel van de w-bufferbenadering is gerelateerd aan hardwareondersteuning: w-buffering wordt niet zo breed ondersteund in hardware als z-buffering.

Voor het gebruik van een z-buffer is overhead vereist tijdens de rendering. Verschillende technieken kunnen worden gebruikt om rendering te optimaliseren bij het gebruik van z-buffers. Zie Z-Buffer Performancevoor meer informatie.

Notitie

De werkelijke interpretatie van een dieptewaarde is specifiek voor de renderer.

 

In deze sectie vindt u informatie over het gebruik van dieptebuffers voor verborgen lijnen en het verwijderen van verborgen oppervlakken.

Direct3D Rendering-