Terrain Texturierung: Tiling ohne Wiederholung
Verfasst: 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?
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?