Wie kann ich verhindern, dass Nähte auf Objekten mit niedrigeren Mipmap-Ebenen angezeigt werden?

7

Haftungsausschluss: Klicken Sie bitte mit der rechten Maustaste auf die Bilder und öffnen Sie sie separat, damit sie in voller Größe angezeigt werden, da es feine Details gibt, die sonst nicht angezeigt werden. Vielen Dank.

Ich habe ein einfaches Blender-Modell hergestellt, es ist ein Zylinder, bei dem die obere Kappe entfernt ist:

Geben Sie hier die Bildbeschreibung ein

Ich habe die UVs exportiert:

Geben Sie hier die Bildbeschreibung ein

Importieren Sie sie dann in Photoshop und malen Sie den inneren Bereich in Gelb und den äußeren Bereich in Rot. Ich habe darauf geachtet, die UV-Linien gut abzudecken:

Geben Sie hier die Bildbeschreibung ein

Ich speichere dann das Bild und lade es als Textur auf das Modell in Blender. Eigentlich lade ich es einfach als das Bild neu, in das die UVs exportiert werden, und ändere den Ansichtsmodus des Ansichtsfensters auf texturiert. Wenn ich mir das Netz aus der Nähe ansehe, ist überall gelb, alles scheint in Ordnung zu sein:

Geben Sie hier die Bildbeschreibung ein

Wenn ich jedoch herauszoome, sehe ich rot (buchstäblich und metaphorisch), wo sich die Texturkanten befinden:

Geben Sie hier die Bildbeschreibung ein

Und je mehr ich zoome, desto mehr sehe ich es:

Geben Sie hier die Bildbeschreibung ein

Dasselbe passiert in Unity, obwohl der Effekt weniger ausgeprägt zu sein scheint. Aus der Nähe ist gut und gelb:

Geben Sie hier die Bildbeschreibung ein

Zoomen Sie heraus und Sie sehen rot an den Nähten:

Geben Sie hier die Bildbeschreibung ein

Für dieses einfache Beispiel besteht eine Problemumgehung darin, das Gelb gut außerhalb der UV-Ränder zu verteilen und es aus allen Entfernungen in Ordnung zu bringen. Dies ist jedoch ein Problem, wenn Sie versuchen, eine komplexe Textur zu erstellen, die nahtlos an den Rändern gekachelt werden soll. In dieser Situation überlappen sich entweder einige Pixelzeilen (in diesem Fall sieht es aus der Nähe schlecht und aus der Ferne in Ordnung aus), oder ich lasse sie nahtlos und habe dann diese Nähte, wenn ich sie aus der Ferne sehe.

Meine Frage ist also, ob mir etwas fehlt oder was ich zusätzlich tun muss, damit meine Textur aus allen Entfernungen nahtlos aussieht?

Shivan Drache
quelle
Ich vermute, dies ist ein Mipmapping-Problem. Sehen Sie diese Frage zu erzeugenden Mipmaps: gamedev.stackexchange.com/questions/11907/...
Michael
Okay, Sie haben wahrscheinlich Recht mit dem Grund, aber es gibt eine Möglichkeit, dies zu beheben. Dh in Unity gibt es keine Kontrolle darüber, welche Mipmap-Ebene ausgewählt wurde (und Sie können auch nicht alles zusammen deaktivieren). Stellen Sie die Textur in einer Auflösung näher an die Mipmap-Ebene her, die die meiste Zeit verwendet wird (damit keine Mip-Maps mehr erstellt werden). DDS-Format verwenden?
Shivan Dragon
3
@ShivanDragon Sie können Mipmaps pro Textur deaktivieren. Dazu müssen Sie die erweiterten Importeinstellungen aufrufen.
Tetrad

Antworten:

14

Das kannst du nicht.

Okay, das war ein bisschen hart. Lassen Sie mich dies anhand von zwei Beispielen veranschaulichen.

  1. Verlassen wir die Welt der Computergrafik. Angenommen, Sie erhalten ein Stück Papier mit der Textur, die Sie uns gegeben haben. Das Papier enthält ebenfalls ein schwach gedrucktes Millimeter-Raster.

    Jetzt bekommen Sie eine Schere und etwas Paste, und Ihre Aufgabe ist es, aus dem Stück Papier einen Zylinder zu machen, aber Sie können nur genau durch das Millimetergitter schneiden. Kein Problem! Das bedruckte Papier wurde ursprünglich so erstellt, dass die gelben und roten Teile genau auf das Millimeter-Raster fallen, sodass Sie Ihren Zylinder problemlos herstellen können.

    Jetzt ist es Ihre Aufgabe, einen Zylinder halb so groß zu machen. Dazu erhalten Sie ein Stück Papier in der halben Größe, wobei alles in der halben Größe gedruckt wird. Hier beginnen Ihre Probleme. Einige der gelb-roten Ränder fallen auf das Millimeter-Raster, andere nicht. Und für diejenigen, die dies nicht tun, können Sie entweder die gelben oder die roten Teile abschneiden. Welches ist korrekter? Es hängt davon ab, ob. Manchmal ist es das Gelbe, manchmal ist es das Rote, manchmal ist es keines ...

  2. Kommen wir also zurück in die Welt der Computergrafik. Versuchen wir, das zu tun, was Sie von der GPU verlangen, wenn Sie sie zum Erstellen von Mipmaps auffordern. Nehmen Sie Ihre große Textur und ändern Sie die Größe in eine Textur, die genau halb so groß ist wie die ursprüngliche. Was passiert an den gelb-roten Rändern? Es hängt davon ab. Dies hängt vom Filteralgorithmus ab, den Sie beim Verkleinern Ihrer Textur verwenden.

    Wenn Sie "Nächster Nachbar" verwenden, behalten Sie Ihre abrupten gelb-roten Änderungen bei, aber einige Ränder (genauer gesagt diejenigen, die in der ursprünglichen Textur in eine ungerade Koordinate fallen) werden zu beiden Seiten des Pixelrasters gezwungen, und Die ursprünglich sorgfältig ausgewählten Texturkoordinaten stimmen nicht mehr mit dem gelb-roten Rand überein.

    Wenn Sie "Bilineare Filterung" verwenden, sind die Dinge nicht wirklich besser. Wenn der gelb-rote Rand nicht wie zuvor in das Pixelraster fällt (auch wenn der Rand in der ursprünglichen Textur auf einer ungeraden Koordinate liegt), ist das resultierende Pixel weder rot noch gelb. Es wird eher wie Orange sein! Ist das akzeptabel? Ich weiß es nicht.

Sie werden feststellen, dass das Problem auf die gelb-roten Ränder beschränkt ist, die in ungeraden Koordinaten liegen. Sie können sagen "kein Problem!" und stellen Sie sicher, dass alle gelb-roten Ränder in geraden Koordinaten liegen und das Problem gelöst ist! Oder ist es?

Eigentlich nicht. Das Problem wird beim Erstellen des ersten Mip-Levels gelöst. Wenn Sie jedoch die nächste Mip-Ebene erstellen, bei der es sich um eine Textur handelt, die ein Viertel der Größe des Originals beträgt, tritt das gleiche Problem bei den gelb-roten Rändern auf, die in der Textur halber Größe nicht in eine gleichmäßige Koordinate fallen. Dies sind diejenigen, die in der ursprünglichen Textur nicht in ein Vielfaches von 4 Koordinaten fallen.

Selbst wenn Sie das Problem für die zweite Mip-Ebene beheben, werden Sie niemals das gesamte Problem lösen. Sie werden es nur auf eine niedrigere Mip-Ebene bringen.

Wie Sie sehen, ist dies kein Problem mit der von Ihnen verwendeten Spiel-Engine. Es ist ein Problem mit Mipmapping im Allgemeinen. Bedeutet dies also, dass Mipmapping nutzlos ist und deaktiviert werden sollte? Nicht wirklich. Mipmapping ist sehr nützlich. Du benutzt es einfach falsch. Eigentlich hast du die Antwort selbst gesagt:

Verteilen Sie das Gelb gut außerhalb der UV-Ränder und es ist aus allen Entfernungen fein

Es scheint ein hässlicher Hack zu sein, ist es aber eigentlich nicht. Ich habe jedoch eine allgemeinere Lösung, die ich hiermit als "Erste Panda-Pyjama-Regel für 3D-Skinning" bezeichne.

Ordnen Sie abrupte Änderungen der UV-Koordinaten keinen abrupten Texturänderungen zu.

Dieses Problem tritt auf, weil Sie eine abrupte Texturänderung (gelb nach rot) einer abrupten Texturkoordinatenänderung (die Änderung zwischen dem Zylinder und dem Hohlraum (oder der Kappe, wenn Sie den Zylinder schließen) zuordnen. Sie möchten Vermeiden Sie dies beim Enthäuten, um das von Ihnen beschriebene Problem zu vermeiden.

Logische Folge:

Wenn Sie eine abrupte Änderung der UV-Koordinate vornehmen müssen, nehmen Sie keine abrupte Texturänderung vor (wie bei Ihrer vorgeschlagenen Lösung zum Verteilen des Gelbs). Wenn Sie eine abrupte Texturänderung vornehmen müssen, stellen Sie diese so ein, dass keine abrupte Änderung der UV-Koordinaten erforderlich ist (dies sollten Sie normalerweise vorziehen).

Sie können die Tatsache nutzen, dass die Form Ihrer Textur im Gegensatz zu Modellen aus Papier und Paste nicht mit der Form Ihres Modells übereinstimmen muss. Wenn Sie die Textur für die Kappe Ihres Zylinders erstellen, müssen Sie sie nicht rund machen. Tatsächlich würde ich es rechteckig machen, damit ich es genau an die Textur der Seiten des Zylinders anpassen kann, um abrupte Änderungen der UV-Koordinaten zwischen den Seiten und den Kappen zu vermeiden (siehe "Filter-> Verzerren-> Polarkoordinaten" in) Photoshop).

Ich würde auch den linken und rechten Rand der Zylindertextur an den linken und rechten Rändern der Textur ausrichten und die Texturzuordnung so einstellen, dass sie umwickelt wird, damit sich die Textur gut um den Zylinder legt.

Panda Pyjama
quelle
2
+1 für "Ordnen Sie abrupte UV-Koordinatenänderungen keinen abrupten Texturänderungen zu."
Bummzack
Danke für die sehr ausführliche Antwort. Ich bin auf einige der Dinge gestoßen, die Sie erwähnt haben, als Sie nach einer Lösung gegoogelt haben, aber Ihre Erklärung klärt eine Menge weiterer Fragen auf, die ich hatte. Ich werde heute Abend versuchen, dies anhand Ihrer Ratschläge (und einer tatsächlichen Textur) zu beheben.
Shivan Dragon
Eigentlich gibt es einen Aspekt, den ich nicht so gut verstanden habe: das Deaktivieren von Mipmaps. Ich verstehe die theoretischen Implikationen: Keine Mipmaps = mehr Videospeicher erforderlich = manchmal passt nicht die gesamte Textur hinein = mehr Speicherumschreibungen = Verlangsamungen. Ich bin jedoch über Artikel gestolpert, die besagen, dass dies eine echte Option sein kann und getestet werden sollte. Ist das wahr? Ist es eine gute Praxis, Mipmaps für bestimmte Spiele zu deaktivieren, wenn das Ding immer noch anständig zu laufen scheint?
Shivan Dragon
3
@ ShivanDragon Ich denke, Sie können Mipmaps falsch verstehen. Mipmapping ist eine Technik, die das Rendern beim Zeichnen kleiner Dinge beschleunigt, indem Sie etwas Videospeicher tauschen (Sie können Aliasing auch durch Mipmapping und trilineare Filterung reduzieren, aber das ist eine andere Geschichte). Durch Aktivieren von Mipmaps verbrauchen Sie tatsächlich mehr Speicher. Im Allgemeinen möchten Sie für 3D das Mipmapping aktivieren, daher empfehle ich nicht, es zu deaktivieren. Der Artikel von Wikipedia über Mipmapping ist ziemlich gut, also sollten Sie es sich ansehen.
Panda Pyjama
0

Es ist ein Problem beim Backen in 3D-Software. Erhöhen Sie einfach die Anzahl der Texturnähte und zweitens geht es in Unity darum, Textur und Mip ein- und auszuschalten. Sie werden sehen, dass die Nähte verschwinden, aber es ist besser, wenn Sie Ihre Textur im Spiel mit Ihrer Hauptkamera sehen.

Jawad
quelle