Unendliche Leistung bei der Geländegenerierung: eine große Höhenkarte oder mehrere kleinere Höhenkarten?

7

Ich generiere ein prozedurales Terrain mit (einem hausgemachten fBm basierend auf) Perlin-Rauschen als Höhenkarte. Um das Gelände unendlich zu machen, zeichne ich einen Teil davon neu, während sich die Kamera bewegt.

Es gibt zwei Alternativen:

  1. haben entweder mehrere (sagen wir 9) Höhenkarten-Texturen und drehen sie, während sich die Kamera bewegt;
  2. oder haben Sie nur eine Höhenkarte (sagen wir 9-mal größer) und zeichnen Sie bei Bedarf nur einen Teil davon neu.

Hinweis:

Die beiden Ansätze zeichnen jedes Mal genau die gleiche Anzahl von Pixeln neu.

Aber:

  1. Im ersten Fall muss ich 3 kleine Texturen binden und sie vollständig neu zeichnen, um eine Linie meines Gitters neu zu zeichnen.
  2. Im zweiten Fall binde ich die gesamte größere Textur und zeichne nur eine Linie darin neu.

Frage: Sollte ich erwarten, dass einer schneller ist als der andere? Hat glBindTexturehöhere Kosten für größere Textur?

Julien__
quelle
Wenn Sie Perlin verwenden, können Sie es einfach im Shader generieren. Keine Notwendigkeit für eine Textur überhaupt.
3Dave
@DavidLively ist eigentlich ein perlinbasiertes fBm mit mehreren Oktaven, daher erwarte ich, dass es teurer ist als eine Textur-Suche. Noch mehr, da ich auf benachbarte Pixel zugreifen muss, um Normalen zu berechnen.
Julien__
Mit dFdx / dFdy können Sie Normalen in Ihrer PS für diese Art von Dingen berechnen. Dies ist erheblich schneller als das Abtasten einer Textur, da sie nur die Registerdatei benachbarter Spuren durchsuchen, anstatt in den Texturspeicher gehen zu müssen.
3Dave
@DavidLively meinst du das Berechnen von Ableitungen des Rauschens? Das klingt sehr interessant, aber ich bin nicht sicher zu verstehen
Julien__
Sie verwenden Rauschen, um eine Textur zu erzeugen, und tasten dann dieses Rauschen ab, um Normalen zu erzeugen, oder? Sie können dasselbe im Shader tun und die Ableitungsanweisungen verwenden, um Rauschwerte von benachbarten Pixeln im Quad zu erhalten und daraus Normalen zu generieren. Es ist der gleiche Vorgang wie offline, aber der Schritt zur Texturgenerierung wird übersprungen. Dies gibt Ihnen auch wirklich unendliches Terrain. Oder zumindest im Bereich des Gleitkommas mit einfacher Genauigkeit.
3Dave

Antworten:

1

Ich weiß, dass dies eine alte Frage ist, aber ich habe viel mit der Erzeugung von prozeduralem Terrain herumgespielt. Daher würde ich die kleinere Option empfehlen (dh neun "Chunks"). Die Verwendung von Chunks bietet einige wichtige Vorteile.

  • Modularität - Sie können Geländequadrate wie Puzzleteile zusammenfügen.
  • Geschwindigkeit - Sie müssen das riesige Gelände um den Spieler nicht neu berechnen, wenn er sich bewegt.

Sie arbeiten natürlich zusammen. Hier erfahren Sie, wie Sie Chunks laden / entladen können, je nachdem, wo sich der Player befindet. Hinweis: Ein Chunk kann entladen werden, wenn sein Inhalt mit einem konsistenten zufälligen oder rauschgenerierenden Algorithmus (z. B. Perlin Noise) generiert wurde. dann können sie wieder geladen werden und sehen gleich aus.

Initialisierung

Spieler = P, Chunk =- :

  --- ---.  
 --P-- 
  --- ---.  

Spielerbewegung

Entladener Block = X; Jede Abbildung erfolgt nach einigen Sekunden seit der letzten.

                   --- ---.
  --- | --P | --P--
 --P-- | ----- | XX ---
  --- | --- | XXX
clabe45
quelle