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:
Ich habe die UVs exportiert:
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:
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:
Wenn ich jedoch herauszoome, sehe ich rot (buchstäblich und metaphorisch), wo sich die Texturkanten befinden:
Und je mehr ich zoome, desto mehr sehe ich es:
Dasselbe passiert in Unity, obwohl der Effekt weniger ausgeprägt zu sein scheint. Aus der Nähe ist gut und gelb:
Zoomen Sie heraus und Sie sehen rot an den Nähten:
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?
Antworten:
Das kannst du nicht.
Okay, das war ein bisschen hart. Lassen Sie mich dies anhand von zwei Beispielen veranschaulichen.
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 ...
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:
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.
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:
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.
quelle
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.
quelle