Zeichne sehr große langsam rotierende Planeten

8

Ich möchte sehr große (~ 500 px) Grafiken von Planeten zeichnen, die sich langsam drehen. Diese Grafiken sollen beeindrucken. Was ist der beste Weg, dies zu tun? Ich habe keine Erfahrung mit einer bestimmten 3D-Engine und bin mir nicht einmal sicher, auf welcher Plattform dieses Spiel laufen würde.

  • Ich könnte jeden Frame vorab rendern, aber bei 500 Pixel und einer Rotationsdauer von 10 Sekunden ist das eine lächerliche Datenmenge pro Planet.
  • Ich könnte eine 3D-Engine verwenden und die Textur des Planeten auf ein Netz abbilden, das sich einer Kugel nähert, aber bei 500 Pixel befürchte ich, dass die Anzahl der Polygone sehr groß sein muss, damit sie gut aussieht.
  • Ich könnte eine Art benutzerdefinierte 3D-Engine schreiben, die nichts anderes tut, als eine strukturierte Kugel effizient zu rendern, indem ich die x / y-Koordinate jedes Ansichtspixels in den Koordinatenraum der Textur der Kugel konvertiere - aber das ist involviert und könnte nicht davon profitieren Grafikbeschleunigung.
  • Etwas anderes, an das ich nicht gedacht habe?

Hier ist ein Beispiel für ein animiertes GIF von dem, was ich meine. (Bei 100 x 100 Pixel und 60 Bildern ist es leider schon ziemlich groß.) Stellen Sie sich das viel, viel größer vor, drehen Sie sich viel langsamer und animieren Sie reibungsloser:

Alt-Text

Wenn dies jedoch 500 x 500 Pixel und 10 x 25 = 250 Bilder wären, würden wir über Hunderte von MB Daten sprechen, sodass dieser einfache Ansatz nicht funktioniert.

Zarkonnen
quelle
Dies ist unmöglich zu beantworten, wenn Sie keine Ahnung haben, was Ihre Zielplattform ist.
AttackingHobo
1
Nun, wenn es 500px groß ist, ist es kein iPhone vor 4G / gleichwertiges Android, was ungefähr das einzige ist, von dem ich erwarten würde, dass es Probleme mit einem so einfachen Rendering gibt.
8
Hmm, ich denke die Antwort könnte einfach "Zarkonnen, Sie haben keine Ahnung, wie leistungsfähig GPUs heutzutage sind" sein. : P
Zarkonnen
1
Dies scheint keine große Datenmenge zu sein.
Die kommunistische Ente

Antworten:

4

Da Sie die Kugel mit einer konstanten Kamera betrachten, können Sie mit einer einfachen vorberechneten Nachschlagetabelle extrem schnell qualitativ hochwertige Renderings durchführen.

Als vorberechneten Schritt rendern Sie mit jeder beliebigen Methode (normalerweise mit Polygonen oder Raytracing) eine texturabgebildete Kugel in einen Offsceen-Puffer. Statt die Farben basierend auf der Textur zu berechnen, speichern Sie nur die Textur-U / V-Koordinaten.

Wenn Sie dann den tatsächlichen Planeten rendern, rendern Sie ein einfaches Quadrat und rufen für jedes Pixel die tatsächlichen U / V-Koordinaten aus der Nachschlagetabelle und die Pixelfarben aus der Planetentextur unter Verwendung dieser U / V-Koordinaten ab. Um die Kugel zu drehen, versetzen Sie einfach die U-Koordinate mit dem Drehwinkel.

Diese Technik war in der Demoszene sehr beliebt, zum Beispiel bei Tunneleffekten mit Texturabbildung, aber leider konnte ich keine guten Tutorials dazu finden.

msell
quelle
0

Wenn Sie dies in einer 2D-Einstellung tun, lesen Sie diese vorherige Frage ...

3D-Illusion einer 2D-Planetentextur

Das gleiche Konzept würde mit einem großen Bild und durch dynamisches Verschieben der Geländetextur auf einer Ebene unter dem "Loch" im Raum gut funktionieren.

Lesen Sie den obigen Link, um zu erfahren, was ich damit meine.

Tim Holt
quelle
3
Ich mag diese Methode wirklich nicht, weil sie genau so aussieht, wie sie ist. Eine flache Textur, die beim Drehen ohne Verzerrung bewegt wird.
AttackingHobo
0

Wenn Sie die resultierende Animation mit einem modernen Video-Codec komprimieren würden, wäre sie überhaupt nicht besonders groß und bei weitem nicht "mehrere hundert MB Daten" oder lächerlich ...

Aber wie bereits erwähnt, hängt alles davon ab, was Ihre Zielplattform ist und wie alle anderen gesagt haben. Das Rendern einer glatten 3D-Kugel würde tatsächlich eine unbedeutende Menge an Polygonen und sehr wenig Datenspeicher erfordern (die Textur ist alles, was vorhanden ist, und selbst bei wirklich hohen Auflösungen würde die Standard-JPEG-Komprimierung zu nichts führen).

Es hängt auch ein wenig davon ab, wie wählerisch Sie sind - wenn Sie nach dem Viertelpixel-Scrolling-Look und den Texturdetails suchen, die mit den neuesten Demos vergleichbar sind, und nicht nur mit modernen Spielen mit all ihrer Interpolation und ihrem Aliasing Probleme sogar bei 8x FSAA - dann könnte es fast endlos werden, um zu erreichen (und auch ein bisschen künstlerischen Trick zu erfordern) ^^

Oskar Duveborn
quelle
1
-1 - "Standard-JPEG-Komprimierung" existiert nicht für Texturen, und Ihr dritter Absatz ist nicht wirklich sinnvoll. "Viertelpixel-Bildlauf" ist über Standardfilterung in OpenGL / Direct3D möglich, und AA wäre für eine solche Szene trivial.
Wahr. Zu meiner Verteidigung dachte ich an Datenspeicherung, nicht an Datendurchsatz, als die Frage "lächerliche Datenmenge pro Planet" für eine Animationslösung lautete. Der letzte Absatz war hauptsächlich eine Bemerkung, in der gefragt wurde, wie hoch die Messlatte gesetzt wurde. Ich habe AA noch nie als trivial angesehen, selbst die strengsten Offline-Rendering-Lösungen für Filme, die Hunderte von Durchgängen auf exotische Weise ausführen, weisen ein Aliasing auf, sobald sich die Dinge in Bewegung setzen, insbesondere auf PC-Bildschirmen mit geringer Dichte - aber die meisten Leute sind das nicht wählerisch.
Oskar Duveborn
0

Wenn Sie Probleme mit der Leistung haben, tun Sie dies auf herkömmliche Weise (Textur und normale Abbildung auf einer Kugel mit hohem Polygon), was, wie viele erwähnt haben, bei dieser Auflösung kein Problem darstellen sollte:

"Raytrace" es mit einem Fragment Shader. Wenn Ihre Kamera fixiert ist, benötigen Sie lediglich eine einheitliche Float-Eingabe in Ihren Fragment-Shader (für den Drehwinkel), und der Shader kann sich um die Berechnung der Texturkoordinaten kümmern. Die Beleuchtungsvektoren können sogar für jeden Frame gleich sein. Was das Anti-Aliasing betrifft, können Sie auch eine perfekte sphärische Silhouette mit wenig Einfallsreichtum erhalten (wenn sich das Pixel an der Kugelgrenze befindet, berechnen Sie die Abdeckung).

Dadurch haben Sie nur 4 Eckpunkte durch die Pipeline gesendet und müssen keinen gigantischen Framebuffer mit mehreren Abtastwerten zuweisen, um Zacken zu bekämpfen.

Auf Kosten mehrerer auf Bestellung gefertigter Algorithmen.

Steven Lu
quelle