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: 1153
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.
Benutzeravatar
MasterQ32
Felix Queißner
 
Beiträge: 937
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: 187
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: 3608
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: 187
Registriert: 23.04.2003, 17:42

Re: Terrain Texturierung: Tiling ohne Wiederholung

Beitragvon Tiles » 24.08.2017, 09:24

Vom Prinzip her geht das Ganze in Richtung Perlin Noise, oder? Nur dass du hier eben Farbtexturen nimmst anstatt Graustufen.
Free Gamegraphics, Freeware Games http://www.reinerstilesets.de
Die deutsche 3D Community: http://www.3d-ring.de
Benutzeravatar
Tiles
 
Beiträge: 1057
Registriert: 11.01.2003, 14:21

Re: Terrain Texturierung: Tiling ohne Wiederholung

Beitragvon starcow » 25.08.2017, 11:52

Ja, Perlin-Noise, dass dürfte die richtige Bezeichnung sein! Das dürfte auch tatsächlich das sein, was Photoshop unter "Wolken" versteht.
Photoshop kennt noch die sogenannten Differenz-Wolken. Aber auch dabei wird es sich wohl blos um eine Perlin-Noise-Struktur handeln, welche per "Differenz" darüber geblendet wird.
Das Perlin-Noise-Muster dient lediglich als Alpha-Maske und kann daher in Graustufen bleiben.
Entscheidend für ein gutes Ergebnis sind grundsätzlich folgende Punkte:
Die Textur selbst, muss in jeder Ebene unterschiedlich vorliegen. Soll heissen eine Kombination aus folgendem: Rotation, Translation, allenfalls gespiegelt.
Das Verfahren sollte dann über min. zwei "Iterations-Stufen" angewandt werden. Das heisst:
Die verschiedenen Ergebnisse, werden wiederum nach dem gleichen Prinzip nochmals mittels Perlin-Noise miteinander gemischt.
Wichtig ist auch, ein immer unterschiedlicher "Seed" des Perlin-Noise-Musters zu verwenden, sowie auch eine andere Skalierung.

Falls Du noch genauere Informationen zum konkreten Vorgehen brauchst, kann ich noch ein paar Bilder dazu posten.

Gruss starcow

Edit:
Was mich wirklich brennend interessiert, ist, ob es neben dem Perlin-Noise noch andere "Rausch-Muster" oder Fraktale gibt, die ebenfalls einen sehr organischen / natürlichen Eindruck erwecken.
Ich kenne mich mit der Technik der prozeduralen Texturgestaltung nicht wirklich aus - finde aber das Thema absolut spannend!
Freelancer 3D- und 2D-Grafik
mischaschaub.com
Benutzeravatar
starcow
 
Beiträge: 187
Registriert: 23.04.2003, 17:42

Re: Terrain Texturierung: Tiling ohne Wiederholung

Beitragvon Tiles » 25.08.2017, 12:26

Puh, ewig her dass mich mich damit beschäftigt habe. Aber ich fand das damals auch super spannend :)

Perlin Noise ist die bekannteste Methode. Wiki spuckt noch so Begriffe wie Gradient Noise, Value Noise und Simplex Noise aus. Da könntest du dich eventuell entlang hangeln :)
Free Gamegraphics, Freeware Games http://www.reinerstilesets.de
Die deutsche 3D Community: http://www.3d-ring.de
Benutzeravatar
Tiles
 
Beiträge: 1057
Registriert: 11.01.2003, 14:21

Re: Terrain Texturierung: Tiling ohne Wiederholung

Beitragvon Krishty » 25.08.2017, 13:25

Ja; hier hatten wir Simplex. Zudo benutzt AFAIK auch was anderes als Perlin für StoneQuest, aber ich finde gerade die Beiträge nicht.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Krishty
 
Beiträge: 6006
Registriert: 26.02.2009, 12:18
Benutzertext: state is the enemy

Re: Terrain Texturierung: Tiling ohne Wiederholung

Beitragvon smurfer » 25.08.2017, 13:39

Hallo zusammen,

in der Doku der libnoise http://libnoise.sourceforge.net/ ist eine ganz gute Erklärung zu kohärentem Rauschen und verschiedenen Modulen neben Perlin Noise z.B. Billow- oder Ridged-Multi-Noise. Sind letztlich alles Funktionen auf Hash-Funktionen basierend, die auf verschiedene Art und Weise überlagert werden.

Beste Grüße

Edit: Noch als Stichworte zum Googlen, es gibt beispielsweise Rauschfunktionen auf Basis von Gabor-Funktionen oder Wavelets. Hier ein recht gutes Übersichtspaper von 2010: http://www-sop.inria.fr/reves/Basilic/2010/LLCDDELPZ10/
smurfer
 
Beiträge: 57
Registriert: 25.02.2002, 15:55

Re: Terrain Texturierung: Tiling ohne Wiederholung

Beitragvon Zudomon » 25.08.2017, 18:39

Krishty hat geschrieben:Zudo benutzt AFAIK auch was anderes als Perlin für StoneQuest, aber ich finde gerade die Beiträge nicht.

Zudo hat auch mal Simplex Noise benutzt... aber jetzt nimmt er fast nur noch Perlin, soweit ich weiß.
Bild
Benutzeravatar
Zudomon
 
Beiträge: 2065
Registriert: 25.03.2009, 08:20

Re: Terrain Texturierung: Tiling ohne Wiederholung

Beitragvon starcow » 27.08.2017, 13:06

Danke für Schlüsselwörter. Ich bin gespannt, was ich da noch alles in Erfahrung bringen kann.

Wenn ich mir vor Augen führe, wie man mit einem "einfachen" Perlin-Noise, wie unten:
Bild

mittels genügend verschiedenen Variationen und einem simplen "Differenz-Blending" auf jenes Ergebnis kommen kann:
Bild

Und die Kombination von Beidem, dann so aussehen kann:
Bild

finde ich das absolut verblüffend!
Und dies aufgrund einer einzigen Funktion.
Mit drei bis vier Funktionen, welche sich vom Erscheinungsbild her bereits deutlich unterschieden, müssten Kombinations-Möglichkeiten entstehen, die unglaublich vielschichtig und facettenreich sind.

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

Re: Terrain Texturierung: Tiling ohne Wiederholung

Beitragvon Tiles » 27.08.2017, 13:10

Ich seh keine Bilder :'3
Free Gamegraphics, Freeware Games http://www.reinerstilesets.de
Die deutsche 3D Community: http://www.3d-ring.de
Benutzeravatar
Tiles
 
Beiträge: 1057
Registriert: 11.01.2003, 14:21

Re: Terrain Texturierung: Tiling ohne Wiederholung

Beitragvon starcow » 27.08.2017, 13:28

Ja, mein Hoster hat wohl *wiedereinmal* einen Ausfall. Sehr ärgerlich. Ich bitte um Entschuldigung.
Ich hoffe der Ausfall ist nur von kurzer Dauer.

Edit:
Die Bilder werden jetzt geladen...
Freelancer 3D- und 2D-Grafik
mischaschaub.com
Benutzeravatar
starcow
 
Beiträge: 187
Registriert: 23.04.2003, 17:42


Zurück zu Grafikprogrammierung

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast