Z-Fighting bei Straßen

Willkommen in der Transport Fever Community

Welcome to the fan community of Transport Fever and Train Fever, the economic simulators of Urban Games. The community is free for you to share and inform yourself about the game. We cultivate a friendly and objective interaction with each other and our team will be happy to answer any questions you may have.

 

Registration and use is of course free for you.

 

We wish you a lot of fun and hope for active participation.

The Team of the Transport-Fever Community

  • Bei Führerstandsmitfahrt auf steileren kurvigen Straßenbahnstrecken taucht ein Bug auf, der den Untergrund zackenförmig durchscheinen lässt. Ursache ist eine Einstellung in der entsprechenden .mtl-Datei.

    Wer schon einmal eine Führerstandsmitfahrt auf einer Straßenbahnstrecke unternommen hat, die über serpentinenförmige Rampen führt, hat womöglich schon einmal folgenden Anblick wahrgenommen:



    Ursache ist das so genannte Z-Fighting: Wenn zwei Texturen zu dicht übereinander oder gar in einer Ebene liegen, weiß die GPU nicht mehr, welche Textur sie in den Z-Puffer übernehmen soll, der für die Tiefendarstellung notwendig ist. Dann hat diejenige Textur Vorrang, die vom Prozessor zuerst gerendert wird. Da diese sich innerhalb von Sekundenbruchteilen ändern kann, kommt es zu einem unschönen Flackern. Da zwei oder mehrere Texturen um den Platz im Z-Puffer 'kämpfen', spricht man auch vom so genannten Z-Fighting. Behoben werden kann dieser Effekt dadurch, dass eine Textur in einem geringen Abstand zu ihrem Untergrund angeordnet wird. Das muss unmittelbar im Mesh erfolgen und hat den Nachteil, dass eigentlich feststehende Maße künstlich manipuliert werden müssen, z.B. bei Schildern und deren Beschriftungen. Bei seitlicher Ansicht könnte dem Betrachter somit der Abstand zwischen Schild und Beschriftung auffallen. Außerdem ist es nicht sicher, ob es bei größeren Entfernungen nicht doch wieder zu Artefakten kommt, da hier die Rechengenauigkeit abnimmt. Grafische Betriebssysteme bieten eine andere Lösung an: Mittels des Polygon Offsets wird eine Textur erst beim Rendern gegenüber dem Untergrund in der Z-Ebene verschoben, ohne dass im Mesh irgendwelche Änderungen notwendig sind.


    Bei der Überlagerung von Straßenbahngleisen und -bettungen macht TPF von dieser Möglichkeit zwar Gebrauch, der zugehörige Wert ist aber zu gering eingestellt. Solange die Gleise nicht aus unmittelbarer Nähe betrachtet werden, gibt es keine Probleme. Bei Führerstandsmitfahrten kann es jedoch solche geben. Auf steileren kurvigen Strecken - die beim Vorbild auch dann und wann auftreten können - sind die Straßenflächen infolge der Schrägstellung leicht verdreht und gegeneinander verschoben, so dass der Effekt sogar über das typische Flackern hinausgeht. Hier scheint der Untergrund in Form zackenförmiger Artefakte dauerhaft durch.


    Um diesen Fehler zu beheben, muss man in den .mtl-Dateien der Straßenbahngleise - es sind pro Gleistyp normalerweise jeweils drei - den Wert von factor unter polygon offset von -3 auf -6 ändern, so dass die Texturen gegenüber der Straßenoberfläche vom visuellen Eindruck her weiter vorne bzw. oben gerendert werden. Das sieht dann so aus:

    Code
    1. polygon_offset = {
    2. factor = -6,
    3. units = -3,
    4. },

    Dass der Wert hier relativ groß gewählt wird, stört nicht, da Straßen normalerweise nur von schräg oben betrachtet werden. Der Wert units muss zumindest in diesem Fall nicht verändert werden.


    Die Änderung sollte nicht in den Originaldateien vorgenommen werden. Besser ist es, eine eigene Mod dafür zu schreiben. Oder man benutzt gleich den Tramgleis-Texturen Tauscher bzw. den Tramgleis-Texturen-Tauscher C, die obendrein noch die Optik der Gleise optimieren.


    Das Problem kann auch losgelöst von der Straßenbahngleis-Problematik bei den Oberflächen einiger Straßen-Mods beobachtet werden. Grundsätzlich können und sollten beim Modden von Straßen die Vanilla-Werte für polygon offset benutzt werden - hierbei muss die Reihenfolge eingehalten werden. forceDepthWrite = true darf nur für die unterste Textur eingetragen werden.


    Diesen Lexikoneintrag habe ich in meinem laienhaften Verständnis verfasst. Sollte jemand noch Anmerkungen, Korrekturen oder Ergänzungen haben - nur zu! ;)

Share