Warum verwenden moderne Spiele einen Render-to-Texture-Ansatz für Spiegel?

40

Bei alten Spielen wie Mario64 oder DukeNukem3D handelt es sich bei allen Spiegeln des Spiels im Wesentlichen nur um Löcher in der Wand, hinter denen eine gespiegelte Kopie der Geometrie vor dem Spiegel platziert ist. Im Falle von DukeNukem3D kann man sogar No-Clip aktivieren und in diesen gespiegelten Raum gehen.

Im Gegensatz dazu verwenden moderne Spiele einen Render-to-Texture-Ansatz für Spiegel. Dies führt dazu, dass die Spiegel bei Annäherung merklich pixelig werden. Eines der ersten Spiele, denen ich auffiel, war Luigi's Mansion, aber es scheint in fast allen modernen Spielen verwendet zu werden.

Welche Änderungen an der Hardware oder den Engines haben dazu geführt, dass der zweite Ansatz heutzutage so dominant geworden ist, und welche Vorteile hat er? In Bezug auf reine Grafiken scheint der erste Ansatz überlegen zu sein, da keine Pixelprobleme auftreten.

Grumbel
quelle
14
Was ist, wenn Sie einen Spiegel an einer Tür zwischen zwei Räumen haben möchten?
Super

Antworten:

37
  1. Die Verwendung von RTT (Render-to-Texture) ermöglicht die einfache Skalierung der Renderqualität (Auflösung, LOD, Beleuchtungskomplexität) für eine anpassbare Leistung. RTT erleichtert auch das Ersetzen der Oberfläche durch eine Cubemap in einem bestimmten Abstand, in dem die Reflexion nur schwer genau zu erkennen ist.
  2. Da es sich bei der Ausgabe um eine Textur handelt, gibt es weitere Optionen für die anschließende Bearbeitung (Beleuchten, Schattieren, Überblenden, Verzerren usw.).
  3. Wenn eine gespiegelte Version der Geometrie in der Szene platziert wird, ist ein komplizierteres Culling erforderlich, wenn sie sich mit der realen Geometrie überschneidet und hinter der Ecke sichtbar ist. In älteren Spielen wurden Levels entwickelt, um dies zu vermeiden. Ganz zu schweigen davon, dass jemand die eigentliche Spiegelung vornehmen muss.
  4. Wenn die Geometrie nicht manuell gespiegelt wird, muss das Rendern durchgeführt werden, indem die Ansichtsmatrix und der Culling-Modus geändert werden (um die Rauminversion in der Matrix zu kompensieren) und der Spiegel mithilfe des Schablonenpuffers ausgeschnitten wird. Moderne Engines ziehen es vor, alle Renderzustände im Voraus zu erstellen. Daher gibt es ein kleines Problem beim Erstellen von Kopien aller Szenen-Renderzustände mit den erforderlichen Änderungen für das Spiegelrendering.

Grundsätzlich bietet die Verwendung von RTT mehr Freiheit für alle.

Schlange5
quelle
Zu 3 .: Die meisten (älteren) FPS-Spiele-Engines verwendeten Halbierungsalgorithmen (wie die berühmte "Portal-Engine", die DOOM verwendet), die bereits (wahrscheinlich vierfache) Polygone für das Sichtbarkeits-Culling beschneiden. Solche Motoren können leicht einen vierfachen "Spiegel" als Sichtportal in einen Raum hinter dem Spiegel treten, ohne sich um die gespiegelte Geometrie außerhalb des Spiegels sorgen zu müssen.
Dronus
@dronus Was? Warum sollte man sich überhaupt die Mühe machen, einen "Spiegel" zu machen? Öffne einfach ein Loch in der Wand.
S. Tarık Çetin
Da die reale Geometrie möglicherweise keinen Raum hinter der Spiegelwand lässt, muss für die Arbeit kein Raum hinter dem realen Spiegel vorhanden sein.
Dronus
29

Nein, Sie irren sich - so haben die Spiegel von Duke Nukem 3D überhaupt nicht funktioniert.

DN3D verwendete eine Portal-Engine . Eine Verbindung zwischen zwei beliebigen Sektoren war zu einem gewissen Grad willkürlich, und als die Rendering-Engine zu einem Portal kam, wusste sie, dass sie damit beginnen musste, einen anderen Sektor in diesem zu rendern. Der Sektor hinter dem Spiegel war im Grunde genommen ein Platzhalter, um mit einer Eigenart des Motors fertig zu werden - der einzige Punkt des Sektors bestand darin, größer zu sein als das, was man "reflektiert" haben musste. Es enthielt keine echte Geometrie. Tatsächlich funktionierte es ziemlich genau so, wie "Portale" in Portal funktionieren - mit der Ausnahme, dass Portal (das auf einer Portal-Engine basiert) die Portale zur Laufzeit erstellt und die Häufigkeit der Portale begrenzt ist (z. B. A) -> B -> A -> B -> A ...), während Build (DN3D) einfach abstürzt, wenn der Stapel überläuft und Sie einen Spiegel auf einen anderen Spiegel richten.

Es ist offensichtlich, wie einfach es ist, damit einen Spiegel zu implementieren - ein Portal zu erstellen, das zurück in den Raum zeigt. Dies bedeutete, dass das Rendern des Spiegels genau so viel kosten würde wie das Rendern des Raums selbst, was eine hervorragende Leistung und Konsistenz ergibt. So lange Sie keinen Spiegel auf einen anderen gerichtet haben. Wenn Sie den Quellcode der Build-Engine durchsehen, werden Sie feststellen, dass es überhaupt keine Spiegel für die Codebehandlung gibt - es muss keinen geben, da Portale so funktionieren. HINWEIS: Es gibt tatsächlich Code, um die gerenderten Pixel zu spiegeln - es Kippt einfach nicht die Geometrie und die verschiedenen Sprites und Effekte. Der Redakteur musste jedoch in der Lage sein, diese "gefälschten" Portale zu erstellen - im Rückblick auf sich. Wenn Sie mehr über die ziemlich intelligente Build-Engine erfahren möchten, gibt es eine großartige Analyse von Fabien Sanglard unter Interna der Build-Engine . Die gesamte Engine wurde als Open-Source-Engine entwickelt und auf moderne Plattformen portiert, obwohl die alte Engine unter Windows 10 noch einwandfrei funktioniert (für Sie getestet: P). Viele der auf Build basierenden Spiele wurden auch aus Open-Source-Quellen hergestellt und / oder neu erstellt.

Warum wird das nicht mehr verwendet? Nun, einige Motoren bevorzugen nicht länger Portale. Es ist schwierig, viele Grafik-Hacks und -Optimierungen anzuwenden - ich kann Sie nicht auf etwas Bestimmtes hinweisen, aber viele Nachbearbeitungen hängen von Hacks ab, die in einer echten Portal-Engine nicht funktionieren würden (sie gehen von einer Menge Annahmen aus) nicht mehr halten). Dies ist im Grunde das gleiche Problem, das diese Spiele mit stereoskopischen Bildern haben - die Hacks funktionieren nicht mehr.

Vor allem wurden Spiegel komplizierter. Sie können komplexe Formen und Texturen haben, sich auf dem Boden befinden (auch als "Wasser" bekannt) usw. Während alle diese Probleme in einer Portal-Engine lösbar sind, wird RTT zu einer einfacheren Wahl und GPUs sind schnell genug damit umgehen.

Trotz alledem gibt es viele Spiele mit 3D-Hardwarebeschleunigung, die die Dinge "real" machen. Von den älteren Spielen zum Beispiel Quake 3 oder Alien vs. Predator. Soweit ich weiß, verwenden Source-Engine-Spiele immer noch "echte" Spiegel. Wenn Sie damit rechnen, dass sich Menschen dem Spiegel nähern und Sie sicherstellen können, dass nicht zu viele reflektierende Oberflächen gleichzeitig vorhanden sind (z. B. durch ebenes Design), sind Portalspiegel nach wie vor sehr attraktiv.

Luaan
quelle
Anscheinend ist der Grund für die verbreitete Annahme, dass Duke Nukem 3D auf diese Weise funktioniert, die Tatsache, dass in den tatsächlichen Ebenenentwürfen der Raum hinter dem Spiegel so groß ist wie der Raum, den er reflektiert, obwohl die Rendering-Engine ihn tatsächlich nicht benötigt.
Random832
Auch Nicht-Spiegelportale spiegeln Dinge nicht, also weiß ich nicht, wie "es keinen Code gibt, der mit Spiegeln umgeht" möglich ist.
Random832
5
@ Random832 Es war irgendwie erforderlich - es gab einige visuelle Artefakte, wenn ein Sektor an der Stelle auftauchte, an der sich der gespiegelte Raum befinden sollte. Dies ist einer der Bereiche, in denen harmlose Annahmen für die Leistung von großer Bedeutung sind. Wenn Sie jemals mit Build herumgespielt haben, haben Sie vielleicht bemerkt, dass zwei Sektoren, die sich auf derselben Höhe kreuzen, nicht gut gerendert werden. Was das Spiegeln angeht, so funktioniert es genauso wie das echte Spiegeln. Haben Sie sich jemals gefragt, warum Spiegel nur auf der y-Achse "kippen"? Aus demselben Grund müssen Sie kein Portal umdrehen, das Sie wieder mit demselben Raum verbindet.
Luaan
Der Punkt ist, ein normales Portal, das in einen Raum führt, der in die entgegengesetzte Richtung weist, müsste die Dinge um 180 Grad drehen, anstatt sie zu reflektieren. Die Fähigkeit, dies nicht zu tun, gilt daher als besondere Behandlung für Spiegel. (Wenn Sie dazu nicht in der Lage sind, funktionieren die Portale nicht als Portale und sind nur für Spiegel geeignet. In diesem Fall handelt es sich bei dem gesamten System um eine spezielle Behandlung für Spiegel.) Und ja, ich weiß, warum Spiegel "nur" auf der y-Achse "spiegeln". Tatsächlich drehen sie sich um die z-Achse. Aber die Tatsache, dass sie eine ungerade Anzahl von Achsen spiegeln, unterscheidet sie von Portalen.
Random832
@ Random832 Kommt natürlich darauf an, wie du die y-Achse nennst :) Und ja, du hast recht, es gibt eine spezielle Behandlung. Aber es ist sehr interessant - es kippt die gerenderten Daten, nicht die Geometrie (und Sprites und alles ... eigentlich ziemlich viel Arbeit). Der Portalrahmen wird umgedreht, das Portal wird wie gewohnt gerendert, und dann wird das Ganze Zeile für Zeile rückwärts gerendert.
Luaan
3

RTT wäre verwendet worden, wenn es möglich gewesen wäre, aber die Hardware-Rendering-Pipeline war eine Möglichkeit.

Ältere Hardware hatte auch Einschränkungen, die das Rendern von Texturen verhinderten. Das Schreiben in den Arbeitsspeicher bedeutet, dass nicht gleichzeitig gelesen werden kann. Um die Renderleistung zu verbessern, wurde der Zielpuffer nur zum Schreiben gesperrt, nur die Anzeige-Hardware konnte daraus lesen. Sie könnten das Lesen anfordern, aber das hat den RAM gesperrt und das Rendern musste warten, bis die Sperre aufgehoben wurde, bevor es den nächsten Frame starten konnte. RTT würde einen großen Engpass in der Pipeline verursachen, und daher wurden andere Lösungen verwendet.

Bevor Hardware-Rendering-Pipelines die Norm waren, wurde RTT verwendet, um die Rendering-Last zu reduzieren. 3D-Rendering für Sprites zur Bereitstellung von Pseudo-3D-Inhalten. Das Rendern von Texturen war damals viel zu kostspielig (CPU), um verwendet zu werden, abgesehen von Spezialmaschinen, die außerhalb des allgemeinen Verbrauchermarktes lagen.

Blindman67
quelle
1

Duke Nukem behandelt, dass die anderen Antworten teilweise korrekt sind, wenn die Geometrie hinter dem Spiegel neu gerendert wird. Es gibt Bereiche hinter Spiegeln, die tatsächlich keine Geometrie enthalten (in Spieledatendateien). Die Geometrie wird zur Laufzeit tatsächlich neu gerendert. Der Grund für die Existenz dieser Bereiche besteht darin, zu vermeiden, dass beim Bearbeiten des Levels versehentlich ein Teil des Levels dort platziert wird :

da es sich um einen markierten Bereich handelt, wird dort keine Geometrie versehentlich platziert.

Spielentwickler
quelle