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:
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.
2d
3d
graphics
graphics-programming
Zarkonnen
quelle
quelle
Antworten:
Die Anzahl der Polygone zum Rendern einer "gut aussehenden" 500 x 500 Pixel großen Kugel mit einem einzigen Zeichenaufruf ist für GPUs auf den meisten Plattformen trivial, insbesondere wenn in der Szene nicht viel anderes vorhanden ist. Es gibt auch einige Hinweise zum Texturieren von Kugeln, um Texelverzerrungen zu vermeiden. Stellen Sie sicher, dass Sie eine Würfelkarte verwenden.
quelle
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.
quelle
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.
quelle
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) ^^
quelle
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.
quelle