miniatuur|Demonstratie van z-fighting met meerdere kleuren en texturen op een grijze achtergrond Z-fighting, ook wel stitching of planefighting genoemd, is een fenomeen bij het renderen van 3D-scènes dat optreedt wanneer twee of meer objecten vrijwel dezelfde afstand tot de camera hebben. Dit zorgt ervoor dat ze vrijwel gelijke of identieke waarden krijgen in de z-buffer, die de diepte bijhoudt. Hierdoor ontstaat er bij het renderen van een specifiek pixel onduidelijkheid over welk van de twee objecten in die pixel getekend moet worden, omdat de z-buffer niet precies kan bepalen welk object verder weg is. Als een van de pixels eenduidig dichterbij zou zijn, kon de andere worden genegeerd.

Z-fighting komt vooral voor bij coplanaire polygonen: vlakken die vrijwel exact dezelfde ruimte innemen zonder dat één vlak duidelijk vóór het andere staat. Als gevolg hiervan worden getroffen pixels willekeurig gevuld met fragmenten van het ene of het andere vlak, afhankelijk van de precisie van de z-buffer. Dit effect kan bovendien variëren wanneer de scène of de camerahoek verandert, waardoor afwisselend het ene en dan weer het andere vlak de z-test "wint". Het resultaat is een flikkerend, onrustig beeld van twee vlakken die om beurten proberen om dezelfde pixels te kleuren. Dit probleem wordt meestal veroorzaakt door beperkte sub-pixelprecisie of afrondingsfouten van zwevendekommagetallen en vastekommagetallen.

Hoe meer precisie de z-buffer heeft, hoe kleiner de kans op z-fighting. Maar bij coplanaire polygonen is het probleem onvermijdelijk, tenzij er correctieve maatregelen worden genomen.

Naarmate de afstand tussen het nabije en verre "clip plane" groter wordt, en vooral wanneer het nabije vlak dicht bij de camera ligt, neemt de kans op z-fighting toe. In grote virtuele omgevingen ontstaat hierdoor vaak een probleem: het zichtbaar maken van zowel objecten op grote afstand als details op de voorgrond vereist een hoge mate van precisie, die in de praktijk moeilijk te realiseren is. In bijvoorbeeld een ruimtevluchtsimulator, waarin een melkwegstelsel op schaal wordt weergegeven, kan dit ertoe leiden dat er onvoldoende precisie overblijft om ook de geometrie van de cockpit op de voorgrond correct weer te geven.

Oplossingsmethoden miniatuur|Het effect dat optreedt bij twee coplanaire polygonen Z-fighting kan worden verminderd door de resolutie van de dieptebuffer te verhogen of de vlakken iets verder uit elkaar te plaatsen. Ook kan na de ruimtelijke transformatie een kleine verschuiving in de diepte worden toegepast. Dit verandert de positie op het scherm niet, maar wel de waarde in de dieptebuffer, waardoor conflicten worden voorkomen.

Een andere methode is het gebruik van een stencilbuffer, een extra gegevenslaag per pixel waarmee de volgorde van tekenen kan worden gecontroleerd. Dit voorkomt dat meerdere vlakken om dezelfde pixels strijden.

Wanneer dezelfde geometrie meerdere keren wordt getekend, bijvoorbeeld in verschillende stappen van een renderproces, kunnen kleine afrondingsverschillen ontstaan. Dit kan z-fighting veroorzaken, zelfs als de objecten eigenlijk identiek zijn. Dit probleem wordt voorkomen door de grafische hardware te dwingen exact dezelfde berekening voor elke stap te gebruiken. Dit heet invariante transformatie.

Het verkleinen van de zichtafstand vermindert de kans op fouten, maar is niet altijd mogelijk. In dat geval kan de verre afstand van objecten worden gesimuleerd door ze dichterbij te plaatsen en te verkleinen.

Ook kan een omgekeerde dieptebuffer worden gebruikt, waarbij verre objecten met meer precisie worden opgeslagen. Deze techniek wordt bijvoorbeeld toegepast in Grand Theft Auto V.

Categorie:3D-computergraphics