Terrain Texturierung: Tiling ohne Wiederholung

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.

Terrain Texturierung: Tiling ohne Wiederholung

Beitragvon Jonathan » 05.07.2017, 14:38

Nach längerer Zeit wollte ich endlich nochmal an meinem Spieleprojekt weiterarbeiten. Aktuelle Baustelle: Das Terrain. Ich hatte (vor längerer Zeit) schonmal eine Diskussion über Pflanzen (d.h. z.B. Gras) gestartet, hier soll es aber zunächst einmal um die Texturierung gehen. Ich habe gestern Abend angefangen, diesen Artikel über verbessertes Texture Splatting zu implementieren, und bin damit auch halb fertig - sehr schicke Idee und wird gewiss einmal hübsch aussehen. Aber da man das Terrain die meiste Zeit von weiter weg sehen wird, möchte ich parallel auch daran arbeiten, dass das dann eben auch gut aussieht.

Im Moment läuft alles sehr klassisch. Ich habe 3-4 Texturen, die gekachelt werden und zwischen denen mit einer 4-Kanal Alpha-Map geblendet wird. Die Texturen haben eine nette Auflösung, bedecken aber nur um die 1-2 Meter pro Kachel - bei mehreren hundert Meter Kantenlänge sind das entsprechend gruselig aus, wenn man es kachelt. Es gibt jetzt ja diverse Tricks, etwa zwei verschiedene UV-Set zu verwenden und die Struktur auf beide irgendwie aufzuteilen. Allerdings frage ich mich gerade, wie man das am geschicktesten und einfachsten macht.

Ich hatte jetzt folgende Idee. Man nimmt eine normale Texturkacheln und benutzt Textursynthese mit neuronalen Netzen um diese über das gesamte Terrain wiederholungsfrei zu kacheln. Nicht, dass ich damit Erfahrung hätte, aber es gibt so viele Demos, dass es nicht so schwer sein kann. Man will das vielleicht nicht in Echtzeit machen, aber ich denke eine Textur für eine Terraingröße zu prozessieren sollte im Minutenbereich möglich sein.
Diese Riesentextur skaliert man nun herunter auf eine handhabbare Größe, wodurch man effektiv einen Tiefpassfilter anwendet. Auf das ursprüngliche Tile wendet man dann einen Hochpassfilter damit nur noch die Details übrigbleiben. Multipliziert man jetzt beide Texturen, sollte man jetzt eigentlich eine speichereffiziente Gesamttextur bekommen, die sowohl aus der Nähe als auch aus der Ferne toll aussieht.

Etwas so komplexes wie ein neuronales Netz zu verwenden hat hoffentlich folgenden Vorteil: Man braucht einfach nur eine herkömmliche, kachelbare Terrain-Textur und generiert den Rest automatisch. Im Gegensatz zu einem halbwegs zufälligem niederfrequenten Rauschen für die Nicht-Detail-Textur, produziert das NN hoffentlich etwas, dass gut und plausibel zu der ursprünglichen Textur passt. Die Detail-Textur ist ebenso sinnvoll, da sie durch den Hochpassfilter auch wirklich nur die Details erhält. Die Texturen sollten also nach dem multiplizieren ein vollständiges Frequenzspektrum ergeben und damit eigentlich ziemlich gut aussehen.

Was haltet ihr von der Idee? Gibt es vielleicht (bestimmt?) schon etwas Vergleichbares? Kann das gut funktionieren und den Einarbeitungsaufwand wert sein?
Lieber dumm fragen, als dumm bleiben!
Benutzeravatar
Jonathan
 
Beiträge: 1129
Registriert: 04.08.2004, 20:06

Re: Terrain Texturierung: Tiling ohne Wiederholung

Beitragvon MasterQ32 » 05.07.2017, 15:56

Ich poste dazu mal das hier: https://www.shadertoy.com/view/Xtl3zf#
Duct tape is like the force. It has a light side, a dark side, and it holds the world together.
MasterQ32
Felix Queißner
 
Beiträge: 887
Registriert: 07.10.2012, 14:56

Re: Terrain Texturierung: Tiling ohne Wiederholung

Beitragvon starcow » 26.07.2017, 14:05

Sehr spannendes Thema, dass mich auch immer wieder beschäftigt.
Deshalb meine bescheidene Meinung dazu :)

@ MasterQ32
Nicht schlecht! Allerdings wirkt das Ergebnis auf mich an einigen Stellen "verzerrt / verzogen" - ein Eindruck, den ich persönlich sehr schnell als störend empfinde.

@Jonathan
Leider ist es mir nicht gelungen, deinen Ansatz in Gänze nachzuvollziehen. Die Ergebnisse der Textursynthese mittels neuronalen Netzen befinden sich jedenfalls bei mir auf einer Skala von "gut" - "unbrauchbar".

Ich möchte Dir noch meinen Ansatz vorstellen. Vielleicht kann er dich ja überzeugen.
Ich arbeite zwar mit Photoshop, aber der Ansatz dürfte für Dich ohne grössere Schwierigkeiten in Deinem Programm als Algorithmus adaptierbar sein.
Ausgangspunkt sind zwei bis drei (oder bei Bedarf auch mehr) Kopien der Textur, welche gespiegelt und / oder um 90 Grad rotiert werden.
Diese Kopien werden jetzt über verschiedene Alpha-Kanäle miteinander geblendet.
Die Alpha-Kanäle wiederum sind prozedural generiert. Ob Wolken, oder andere Fraktale - man hat die freie Auswahl. Je nach dem, was gerade zum Textur-Typ passt.
Wichtig ist, den Kontrast bei den prozedural generierten Mustern stark anzuziehen.
Die Muster und Fraktale müssen nicht hoch aufgelöst sein, da sie, so oder so, nur aus grosser Distanz zu sehen sind, bzw. ihre Wirkungsweise ja nur indirekter Natur ist.
Zu guter Letzt lässt sich der so erstellte Alpha-Kanal auch nochmals "multiplizierend" / "negativ-multiplizierend" auf das gesammt Ergebnis subtil anwenden, um dem Terrain noch etwas mehr Plastizität zu geben (es reichen meist 5% - 15%).
Hier mein Ergebnis. Mit Photoshop. Aber wie gesagt rein methodisch, ohne händisch einzugreifen. Und nach meiner Einschätzung nach gut adaptierbar für eine Echtzeitanwendung.

Ausgangs-Textur war eine 3350px grosse Gras-Textur von textures.com
Hier zu sehen: 16x16 Repetitionen

Bild


Ergebnis nach der beschriebenen Methode

Bild


Variante mit der selben, vergrössterten Textur als Alpha-Maske

Bild


Vergrösserter Ausschnitt

Bild


Vielleicht noch zu meinem Ansatz Nr. 2
Um optisch noch ein überzeugenderes Ergebnis zu erhalten, kann man die Ausgangs-Textur auf vier bis acht Varianten erweitern. Dabei ist lediglich zu beachten, dass alle vier Katen zueinander "kompatibel" bleiben.
Nun kann man die ganze Fläche nach dem Zufallsprinzip mit diesen Varianten auffüllen.
Dann noch meine erste Methode darauf anwanden - und ich behaupte mal, man ist nicht mehr in der Lage irgendwelche Muster auszumachen. :-)

Gruss starcow
Zuletzt geändert von starcow am 26.07.2017, 15:14, insgesamt 2-mal geändert.
Freelancer 3D- und 2D-Grafik
mischaschaub.com
Benutzeravatar
starcow
 
Beiträge: 178
Registriert: 23.04.2003, 17:42

Re: Terrain Texturierung: Tiling ohne Wiederholung

Beitragvon Schrompf » 26.07.2017, 14:41

Simple Idee, aber das Ergebnis kann sich sehen lassen. Coole Sache, Mischa!
Häuptling von Dreamworlds. Baut an was Neuem. Hilft nebenbei nur höchst selten an der Open Asset Import Library mit.
Benutzeravatar
Schrompf
Thomas Ziegenhagen
Moderator
 
Beiträge: 3588
Registriert: 26.02.2009, 00:44
Wohnort: Dresden
Benutzertext: Lernt nur selten dazu

Re: Terrain Texturierung: Tiling ohne Wiederholung

Beitragvon starcow » 26.07.2017, 14:52

Vielen Dank Schrompf! :-)

Hier noch eine Variante, mit einem härterem Setting (Die Alpha-Masken haben einen sehr hohen Kontrast / nahezu Schwarz-Weiss)

Bild


Vergleich Ausgang / Resultat

Bild

Gruss starcow
Freelancer 3D- und 2D-Grafik
mischaschaub.com
Benutzeravatar
starcow
 
Beiträge: 178
Registriert: 23.04.2003, 17:42


Zurück zu Grafikprogrammierung

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

cron