In dem kĂŒrzlich veröffentlichten Marvels Spider-Man-Spiel haben viele GebĂ€ude InnenrĂ€ume auĂerhalb der Fenster. Sie sehen toll aus, aber es scheint, dass sie mit gerissenem Rendering implementiert wurden - die Geometrie der InnenrĂ€ume existiert nicht wirklich und wird von einem Shader generiert. Ich habe keine offiziellen Insomniac-Aussagen darĂŒber gesehen, wie sie es gemacht haben, aber basierend auf dem Aussehen des Effekts ist es sehr wahrscheinlich, dass die
Innenkartierungstechnik , die ich 2007 wĂ€hrend der Arbeit an der Dissertation entwickelt habe, implementiert wurde. Ich habe vorher noch nicht im Blog darĂŒber geschrieben, daher ist jetzt der richtige Zeitpunkt, um den neugierigen kleinen Shader zu erklĂ€ren, den ich mir ausgedacht habe.
Beginnen wir mit Marvels Spider-Man-Gameplay. Das Spiel sieht einfach groĂartig aus. Die Kotaku-Website hat ein separates Video unter Windows aufgenommen:
Wie Sie in etwa 40 Sekunden des Videos sehen können, sind die RĂ€ume tatsĂ€chlich nicht Teil der Geometrie: Wo sich das Fenster offensichtlich befinden sollte, befindet sich die TĂŒr. Wenn wir einen Raum aus verschiedenen Blickwinkeln des GebĂ€udes betrachten, sehen wir auĂerdem ein anderes Interieur. In einigen FĂ€llen gibt es sogar eine Mauer um die Ecke des GebĂ€udes. All dies macht uns verstĂ€ndlich, dass die RĂ€ume nachgeahmt werden. Aus perspektivischer Sicht werden sie jedoch korrekt angezeigt und haben eine echte Tiefe.
Ich denke, die Nachteile solcher RÀume sind wÀhrend des Spiels nicht sehr wichtig, da die Spieler die RÀume normalerweise nicht so genau studieren: InnenrÀume sind nur eine Kulisse und kein Gegenstand sorgfÀltiger Studien. Ich glaube, dass diese Art der Schaffung von RÀumen der Stadt Tiefe und Leben verleiht, ohne zu viele Ressourcen aufzuwenden.
Um Ressourcen zu sparen, haben GebĂ€ude in Spielen hĂ€ufig keine InnenrĂ€ume, wie im Screenshot von GTA V zu sehen istZunĂ€chst möchte ich erklĂ€ren, dass mein Beitrag keine Beschwerde ist: Ich freue mich, dass meine AusrĂŒstung in einem so groĂen Spiel verwendet wurde, und beschuldige Insomniac in keiner Weise, gestohlen zu haben. Wie ich in der ersten Veröffentlichung zur Innenraumkartierung sagte, wĂ€re es mir eine Ehre, wenn jemand diese Technik anwenden wĂŒrde. Wenn Insomniac meine Idee in ihrer Technik wirklich ausgenutzt hat, dann finde ich das groĂartig. Wenn sie es nicht benutzt hat, scheint sie sich etwas seltsam Ăhnliches ausgedacht zu haben. Dann wĂŒrde mich interessieren, wie das gemacht wurde.
Wie funktioniert die Innenzuordnung? Die Idee ist, dass das GebĂ€ude selbst keine zusĂ€tzliche Geometrie enthĂ€lt. InnenrĂ€ume existieren nur im Shader. Dieser Shader fĂŒhrt Raycasts mit WĂ€nden, Decken und Böden durch, um zu berechnen, was der Spieler im Innenraum sehen sollte.
Von links nach rechts: nur Fenster mit Reflexionen, Fenster mit Innenzuordnung, Drahtmodell - Bei der Innenzuordnung werden keine Polygone hinzugefĂŒgt.Der fĂŒr den Raycast verwendete Strahl ist einfach ein Strahl von der Kamera zum Pixel. Das Pixel, das wir rendern, befindet sich auĂerhalb des GebĂ€udes. Daher verwenden wir nur den Teil des Strahls nach dem Pixel, da sich dieser Teil tatsĂ€chlich innerhalb des GebĂ€udes befindet.
Raycasting mag wie eine komplizierte und kostspielige Operation erscheinen, aber in diesem speziellen Fall ist es tatsĂ€chlich sehr einfach und schnell. Der Trick besteht darin, dass Sie eine einfache EinschrĂ€nkung hinzufĂŒgen können: Bei der Zuordnung von InnenrĂ€umen befinden sich Decken und Böden in einem konstanten Abstand. Wenn wir das wissen, können wir leicht berechnen, in welchem ââRaum wir uns befinden und wo sich Boden und Decke in diesem Raum befinden. Decken und Böden selbst sind endlose geometrische Ebenen. Die Berechnung des Schnittpunkts zwischen einer unendlichen Ebene und einem Strahl dauert nur wenige Schritte und verbraucht wenig Ressourcen.

Der Raum hat 6 Ebenen: Decke, Boden und 4 WĂ€nde. Wir mĂŒssen jedoch nur drei davon berĂŒcksichtigen, da wir wissen, in welche Richtung wir schauen. Wenn wir zum Beispiel nach oben schauen, mĂŒssen wir den Boden darunter nicht ĂŒberprĂŒfen, da wir die Decke oben sehen. In Ă€hnlicher Weise mĂŒssen wir anstelle von 4 WĂ€nden nur zwei in der Richtung betrachten, in die wir schauen.
Um zu bestimmen, was wir sehen, mĂŒssen wir den Schnittpunkt des Strahls mit jeder dieser drei Ebenen berechnen. Der Schnittpunkt mit dem Strahl, der der Kamera am nĂ€chsten liegt, sagt uns, welche der Ebenen wir in diesem Pixel sehen. Dann verwenden wir den Schnittpunkt als Koordinate der Textur, um die Farbe des Pixels zu ermitteln. Wenn sich der Strahl beispielsweise an der Position (x, y, z) mit der Decke schneidet, verwenden wir (x, y) als Texturkoordinate und ignorieren z.
Hier habe ich eine gute Optimierung hinzugefĂŒgt: Ein Teil der Schnittberechnungen fĂŒr jede der drei Ebenen kann gleichzeitig durchgefĂŒhrt werden. Die verwendeten Shader arbeiteten mit float4 mit der gleichen Geschwindigkeit wie mit float, so dass dank der geschickten Packung von Variablen alle drei Strahlen gleichzeitig mit Ebenen geschnitten werden konnten. Dies hat mir einige Ressourcen gespart und dazu beigetragen, auch 2007 eine hohe Bildrate mit Innenausstattung zu erzielen. Mir wurde gesagt, dass moderne Grafikkarten mit Float schneller funktionieren als mit Float4. Dies bedeutet, dass diese Optimierung auf der aktuellen Hardware nicht mehr funktioniert.
Die Innenzuordnung ohne Fenstertexturen zeigt, dass RÀume mit der richtigen Perspektive und den richtigen Texturen gerendert werden, obwohl keine zusÀtzliche Geometrie erforderlich ist.Weitere
Informationen zur Innenraumzuordnung finden Sie in
meinem Artikel . Dieser Artikel wurde 2008 auf der Computer Graphics International Conference veröffentlicht. Diese von Experten begutachtete Veröffentlichung ist meine erste (und einzige) Bewerbung fĂŒr den stolzen Titel eines Wissenschaftlers. In diesem Artikel werden auch zusĂ€tzliche Experimente beschrieben, um Details hinzuzufĂŒgen, z. B. das Ăndern des Abstands zwischen WĂ€nden fĂŒr RĂ€ume ungleicher GröĂe und das zufĂ€llige AuswĂ€hlen von Texturen aus einem Texturatlas fĂŒr eine gröĂere RaumvariabilitĂ€t. AuĂerdem werden die beiden in den folgenden Bildern gezeigten Variationen ausfĂŒhrlich beschrieben.
Die Beleuchtung in RÀumen kann dynamisch ein- und ausgeschaltet werden, um einen Wechsel von Tag und Nacht zu simulieren. Dies geschieht unter Verwendung der Rauschtextur, aus der wir lesen, wobei der Raumindex als Texturkoordinaten verwendet wird.Da wir nur Strahlen in der Ebene aussenden, sind alle RÀume einfache Quadrate mit Texturen. Alle Möbel im Raum werden auf der Textur sein, was bedeutet, flach zu bleiben. In Spiderman macht sich dies bemerkbar, wenn Sie sich der Kamera nÀhern: Die Tische in den RÀumen sind eigentlich flache Texturen an den WÀnden. Wie Sie in der Abbildung unten sehen können, können wir unsere Technik durch eine oder mehrere zusÀtzliche Texturschichten pro Raum ergÀnzen. Dies ist jedoch mit zusÀtzlichen Leistungskosten verbunden.
Durch Raytracing einer anderen Ebene parallel zur AuĂenflĂ€che des GebĂ€udes können Sie dem Raum Möbel und Personen hinzufĂŒgen. Sie bleiben jedoch weiterhin flach.Nach der Veröffentlichung dieses Beitrags sagte mir einer der Programmierer Simcity (2013), dass die Interior-Mapping-Technik auch in diesem Spiel verwendet wurde. Darin sieht sie sehr cool aus und die Entwickler haben ein groĂartiges Video darĂŒber aufgenommen. Sie verfeinerten meine ursprĂŒngliche Idee, indem sie alle Texturen in einer Textur speicherten und RĂ€ume unterschiedlicher Tiefe hinzufĂŒgten. Der innere Kartierungsteil beginnt um 1:00 Uhr morgens:
Wenn Sie diese Technik genauer untersuchen möchten, können Sie
meine Demo zur
Innenzuordnung mit Quellcode herunterladen. Wenn Sie in Unreal Engine 4 arbeiten, finden Sie die Innenraumzuordnung als Standard-Engine-Funktion in Form der InteriorCubeMap-Funktion.
Nach so vielen Jahren ist es groĂartig zu sehen, dass meine Interieur-Mapping-Technik bei der Produktion von groĂen Videospielen verwendet wird! Wenn Sie mit Spielen vertraut sind, die etwas Ăhnliches verwenden, schreiben Sie mir darĂŒber.