Wie erfolgt das Rendern von Software?


15

Ich möchte die softwarebasierte Echtzeit-Rasterisierung untersuchen. Ich weiß, dass heutzutage alles auf die GPU zusteuert, aber es gibt einige Spiele, bei denen es immer noch sinnvoll ist, einen Software-Renderer zu verwenden.

Zum Beispiel: Voxeltron

Voxatron ist ein Arena-Shooter, der in einer Welt aus Voxeln spielt. Alles im Spiel wird in einem virtuellen 128x128x64-Voxel-Display angezeigt, einschließlich der Menüs und des Player-Inventars. Wenn Sie genau hinsehen, können Sie manchmal sehen, dass das Inventar (Punktzahl / Leben / Munition) einen Schatten auf einige Objekte auf dem Boden wirft.

Ich habe lange Zeit an Voxel-Rendering- und Modellierungswerkzeugen gearbeitet, mit dem ultimativen Ziel, ein großes Erkundungs-Abenteuerspiel zu entwickeln. Vor ungefähr einem halben Jahr hat es mit der Arbeit verschmolzen, die ich an Arena-Shootern für Conflux gemacht habe, und das ist das Ergebnis.

Im Kern ist es ein recht einfaches Spiel - meistens nur Robotron, das in einer 3D-zerstörbaren Welt mit albernen Kreaturen spielt. Ich bin mir nicht sicher, wie groß die Auswirkungen der Zerstörbarkeit auf das Gameplay sein werden, aber es macht auf jeden Fall Spaß, Mauerstücke wegzusprengen. Ich habe auch einen experimentellen Wandbau-Pickup hinzugefügt, mit dem Sie Barrieren bauen können, um sich vor gruseligen Monstern zu verstecken.

Das Spiel findet in einer kleinen Reihe von Arenen statt. Einige von ihnen bieten Räume mit angesetzten Actionstücken, irgendwo zwischen Knightlore und Smash TV. Dies ist ein Teil des ursprünglichen abenteuerlichen Designs und eine Ausrede, um thematische Umgebungen zu schaffen.

Eigenschaften:

  • Benutzerdefiniertes Software-Rendering mit weichen Schatten.
  • Eingebauter Sound- und Musiksynthesizer (wird auch zum Musikmachen des Trailers verwendet).
  • Wiedergabe und Aufzeichnung nach dem Spiel.

1
Ordentlicher Link zu einem Spiel. Es ist nicht erforderlich, einen Software-Renderer zu verwenden, um weiche Schatten auf der GPU zu erhalten . Auf der Seite des Render-Loops sind einige Leistungseinschränkungen zu erwarten, und er kann nicht auf einfacheren Computern wie 1,6-GHz-Laptops oder Handheld-Geräten ausgeführt werden, wenn er die verfügbare Hardware wirklich ausnutzt.
Bobobobo

Antworten:


11

Ich gehe davon aus, dass Sie bereits einige Grundkenntnisse der linearen Algebra haben, wie z. B. 3D-Projektionen, Kameraeinstellungen, Verwandeln von Scheitelpunkten in Weltpositionen usw. Wenn Sie dies nicht tun, gibt es viele großartige Orte, von denen Sie lernen können. Hier sind zwei, die mir gefallen:

Game Engine-Architektur

  • Kurze Beschreibung der grundlegenden linearen Algebra, aber alles, was Sie wissen müssen. Das Buch lohnt sich auch aus vielen anderen Gründen.

Echtzeit-Rendering

  • Eine etwas detailliertere Berichterstattung, die sich aber wieder nur an das hält, was Sie möglicherweise wissen müssen. Auch hier empfehle ich diesen für die Themen, die in den restlichen Kapiteln behandelt werden.

Sobald Sie wissen, wie 3D-Objekte dargestellt und gehandhabt werden, können Sie sie auf dem Bildschirm anzeigen. Typischerweise wird dies mit einer Rasterisierungstechnik für Scan-Linien-Dreiecke durchgeführt. Es ist eigentlich ein ziemlich einfaches Konzept. Sie zeichnen jeweils eine Zeile eines Dreiecks, während Sie die Farb- und UV-Texturkoordinaten interpolieren. Dieser Vorgang wird für alle Dreiecke auf dem Bildschirm fortgesetzt. Sie können sogar einen Tiefenpuffer implementieren, um das Rendern außerhalb der Reihenfolge zu handhaben.

Bildbeschreibung hier eingeben Bildbeschreibung hier eingeben Bildbeschreibung hier eingeben

Dies wird in diesen Artikeln ausführlicher behandelt:

Tutorial - Einführung in softwarebasiertes Rendern: Dreieckrasterung

Software-Rendering-Schule: Teil I


Schauen Sie sich zum Spaß den folgenden Artikel an:

Quake 2 Source Code Review 3/4 (Software-Renderer)



Einige gute Links da!
Jonathan Connell

5

Dies ist ein ziemlich breites Thema. Es gibt jedoch zwei grundlegende Teile: die eigentliche Theorie der Graphiktransformations- und Rasterisierungspipeline und die eigentlichen Implementierungsbits, mit denen Sie Pixel auf den To-Screen sprengen können, wie Sie möchten. Darüber hinaus gibt es auch eine Optimierung (insbesondere des letzteren Bits).

Der erste Teil ist glücklicherweise derselbe wie die Theorie, die für die Grafik-Pipeline verwendet wird, wie sie von moderner Hardware und APIs offengelegt wird. Wenn Sie dies bereits wissen, sind Sie bereit. Wenn nicht, empfehle ich ein gutes Buch. Dieser ist ziemlich gut.

Für den zweiten Teil gibt es viele Möglichkeiten. Sie hängen stark von Ihren Betriebssystem- und Toolchain-Optionen ab. Wenn Sie C oder C ++ verwenden, können Sie unter Windows einfach Pixel direkt in eine GDI-Bitmap zeichnen ( SetPixelist einfach, aber schmerzhaft, nutzlos langsam - CreateDIBSectiongibt Ihnen einen Teil der unformatierten Bytes, die Sie mit einer viel schnelleren Rate bearbeiten können).

Sie können auch eine DirectDraw-Oberfläche erwerben und darauf schreiben oder in eine Direct3D- oder OpenGL-Textur schreiben. In letzteren Fällen wird weiterhin Hardware verwendet. Solange Sie jedoch das gesamte endgültige Image auf der CPU selbst erstellen und die Hardware-APIs verwenden, um die Ergebnisse auf den Bildschirm zu kopieren, zählt dies weiterhin. Auf modernen PCs kann man sowieso nicht direkt auf das Raw-VRAM oder etwas anderes zugreifen.

Wenn Sie mehr wissen möchten, sollten Sie wahrscheinlich spezifischere Fragen erstellen. Ich oder andere würden gerne antworten.


Zum Buch: Wie gut ist "ziemlich gut"? $ 84 ist ein
Jonathan Connell

Es ist das, was ich am meisten empfehle. Die günstigste Option finden Sie in der Direct3D-Dokumentation zur Transformationspipeline. Obwohl es D3D-spezifisch ist, sind 95% davon ziemlich gut auf die allgemeine Theorie anwendbar. Sie können auch die Online-Kopien des OpenGL Red Book einsehen. Sie sind veraltet, aber die Theorie (wieder) gilt immer noch.

0

Okay, ich gehe diese Frage von Grund auf an. alles, was darüber hinausgeht, ist für eine einfache Qualitätssicherung viel zu umfassend. Sie müssen ein Buch zu diesem Thema kaufen.

Der grundlegendste Unterschied zwischen dem Rendern in Software und der Verwendung einer GPU besteht im Zeichnen von Pixeln. Das heißt, wenn Sie Software-Rendering ausführen, sind Sie letztendlich dafür verantwortlich, jedes verdammte Pixel zu zeichnen, während bei einer GPU das Zeichnen von Pixeln durch die Hardware weitgehend automatisiert wird und Sie die Pixel-Pipeline nur mit Shadern "massieren".

Überlegen Sie sich beispielsweise, was Sie als Programmierer tun müssen, um ein 3D-Dreieck auf dem Bildschirm anzuzeigen. Mit einer GPU können Sie der Hardware so ziemlich nur die X-, Y- und Z-Koordinaten der Scheitelpunkte mitteilen, und dann füllt die Videokarte alle Pixel auf dem Bildschirm aus, aus denen das Bild eines Dreiecks besteht. Sie können einen Shader verwenden, um die GPU anzuweisen, die Farbe jedes Pixels basierend auf einer Textur oder etwas anderem zu ändern. Letztendlich kommt es jedoch immer noch darauf an, dass die GPU automatisch alle Pixel für Sie ausfüllt.

Wenn Sie Software rendern, müssen Sie berechnen, welche Pixel auf dem Bildschirm ausgefüllt werden sollen, und dann die Überblendung durchführen, um diese Pixel tatsächlich auszufüllen. Das heißt, Sie würden die Matrixmathematik ausführen, um den Koordinatenraum der 3D-Szene in den Ansichtsraum zu transformieren und dann Punkte aus dem Ansichtsraum auf den Bildschirm usw. zu projizieren.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.