Wie der Rahmen des neuen Schicksals gerendert wird

Ursprünglicher Autor: Adrian Courrèges
  • Übersetzung


Das erste DOOM , das 1993 herauskam , veränderte die Spielentwicklung und -mechanik grundlegend, wurde zum Welthit und schuf neue Idole wie John Carmack und John Romero .

Heute, 23 Jahre später, ist id Software im Besitz von Zenimax . Alle Gründer haben das Unternehmen bereits verlassen. Dies hinderte das id-Team jedoch nicht daran, ihr ganzes Talent unter Beweis zu stellen, indem es ein exzellentes Spiel veröffentlichte.

Das neue DOOM ergänzt das Franchise perfekt. Es verwendet die neue id Tech 6 Engine . Nachdem John Carmack gegangen war, wurde er durch den früheren Crytek-Entwickler Tiago Sousa als Lead-Render-Programmierer ersetzt .

Traditionell veröffentlichte id Software einige Jahre nach ihrer Erstellung den Quellcode ihrer Engines, was häufig zu interessanten Remakes und analytischen Artikeln führte . Es ist nicht bekannt, ob id Tech 6 diese Tradition fortsetzen wird, aber wir brauchen nicht unbedingt den Quellcode, um die merkwürdigen Grafiktechniken zu schätzen, die in der Engine verwendet werden.

Wie der Rahmen gerendert wird


Wir werden die Szene aus dem Bild unten analysieren, in der der Spieler ein Nest aus Blut angreift , das von mehreren Besessenen bewacht wird , unmittelbar nachdem er zu Beginn des Spiels eine prätorianische Rüstung erhalten hat .



Im Gegensatz zu den meisten modernen Windows-Spielen verwendet DOOM nicht Direct3D , sondern OpenGL und Vulkan .

Vulkan - das ist eine große neue Technologie neben Baldur Karlsson (Baldur Karlsson) erst vor kurzem zusätzliche Unterstützung in dem Vulkan RenderDoc , so war es schwer , die Versuchung zu widerstehen innen DOOM Motor zu bekommen. Alle folgenden Beobachtungen wurden in einem Spiel von Vulkan auf der GTX 980 gemacht.Wenn alle Einstellungen auf Ultra gesetzt sind , werden einige Vermutungen einer Präsentation von Thiago Souza und Jean Geffroy auf Siggraph entnommen .

Megatexture Update


Die erste Stufe des Renderns ist das Aktualisieren von Megatexturen . Diese Technologie, die bereits in ID Tech 5 eingeführt wurde , wurde in RAGE und jetzt im neuen DOOM verwendet.

Kurz gesagt, die Bedeutung dieser Technologie besteht darin, dass sich im Speicher des Videoprozessors mehrere große Texturen (in DOOM haben sie eine Größe von 16 KB x 8 KB) befinden. Jeder von ihnen ist eine Sammlung von 128x128 Kacheln.


128 x 128 Seiten in 16k x 8k-Textur

Alle diese Kacheln sollten eine ideale Zusammenstellung von tatsächlichen Texturen mit einem guten Grad an Mip-Texturierung sein, die später von Pixel-Shadern verwendet werden, um genau die Szene zu rendern, die wir sehen.

Wenn ein Pixel-Shader von einer "virtuellen Textur" liest, liest er einfach einige dieser physischen Kacheln von 128 x 128.

Natürlich, je nachdem , wo ein Spieler zu beobachten, eine Reihe dieser Texturen ändern wird: auf dem Bildschirm erscheinen die neuen Modelle, die auf anderen virtuellen Texturen , die einen Download von neuen Fliesen erfordern und Entladen der alten ...

Also, am Anfang des DOOM Rahmen aktualisiert mehrere Fliesen mit Hilfe von Anweisungen vkCmdCopyBufferToImage, um aktuelle Texturdaten auf die GPU zu schreiben.

Mehr über Megatexturen können Sie hier und hier lesen .

Atlas der Schattenkarten


Für jede Lichtquelle erzeugt der Schattenwurf, eine einzigartige Tiefenkarte in einem riesigen eine Kachel gespeichert Texturatlas Größe von 8k x 8k. Es wird jedoch nicht jede Tiefenkarte für jeden Frame berechnet: DOOM verwendet aktiv die Ergebnisse des vorherigen Frames und zählt nur die Tiefenkarten auf, die aktualisiert werden müssen.


Tiefenpuffer 8k x 8k (vorheriger Frame)


Tiefenpuffer 8k x 8k (aktueller Frame)

Wenn eine Lichtquelle statisch ist und nur auf statische Objekte Schatten wirft, ist es ratsam, die Tiefenkarte einfach so zu speichern, wie sie ist, und keine unnötigen Berechnungen durchzuführen. Wenn sich der Feind jedoch zu diesem Licht bewegt, muss erneut eine Tiefenkarte erstellt werden.

Die Abmessungen von Tiefenkarten können je nach Entfernung von der Quelle zur Kamera stark variieren. Darüber hinaus müssen sich neu berechnete Tiefenkarten nicht in derselben Atlas-Kachel befinden.

DOOM verwendet bestimmte Optimierungen, z. B. das Zwischenspeichern des statischen Teils der Tiefenkarte mit der Berechnung der Projektionen nur von dynamischen Gittern und der anschließenden Zusammenstellung der Ergebnisse.

Tiefenbearbeitung vorläufig


Alle undurchsichtigen Gitter wurden bereits gerendert und ihre Tiefeninformationen wurden in die Tiefenkarte übertragen. Dies ist zunächst die Waffe des Spielers, dann die statische Geometrie und schließlich die dynamische Geometrie.


Tiefenkarte: Bereitschaft 20%


Tiefenkarte: Bereitschaft 40%


Tiefenkarte: Bereitschaft 60%


Tiefenkarte: Bereitschaft 80%


Tiefenkarte: Bereitschaft 100%

Tatsächlich werden bei der Vorverarbeitung der Tiefenverarbeitung jedoch nicht nur Informationen über die Tiefen gespeichert.

Beim Rendern der Tiefenkarte von dynamisch Objekten ( besessenDie Geschwindigkeit pro Pixel wird berechnet und in einen anderen Puffer geschrieben, um eine Geschwindigkeitskarte zu erstellen. Die Berechnungen werden ausgeführt, indem im Scheitelpunkt-Shader die Positionsdifferenz jedes Scheitelpunkts zwischen dem vorherigen und dem aktuellen Frame berechnet wird.


Geschwindigkeitskarte

Zum Speichern der Geschwindigkeit benötigen Sie nur 2 Kanäle: der rote speichert die horizontale Geschwindigkeit und der grüne die vertikale.

Der Besessene bewegt sich schnell auf den Spieler zu (daher ist er grün) und die Waffe ist fast bewegungslos (schwarz).

Und was ist das für ein gelber Bereich (rot und grün sind gleich 1)? Tatsächlich ist dies die Standardfarbe des Quellpuffers, was bedeutet, dass keine dynamischen Netze vorhanden sind: Dies ist der „Bereich der statischen Netze“.

Warum führt DOOM keine Geschwindigkeitsberechnung für statische Netze durch? Weil die Geschwindigkeit eines statischen Pixels anhand seiner Tiefe und des neuen Kamerazustands im Vergleich zum letzten Bild leicht zu ermitteln ist. es ist nicht notwendig, es für jedes Gitter zu berechnen.

Die Geschwindigkeitskarte ist später beim Hinzufügen von Bewegungsunschärfe hilfreich .

Clipping-Anfragen


Wir bemühen uns, so wenig geometrische Objekte wie möglich zum Rendern in der GPU zu senden. Der beste Weg, dies zu erreichen, besteht darin, alle für den Player unsichtbaren Raster auszuschneiden. Das Beschneiden unsichtbarer Teile in DOOM wird größtenteils von der Umbra-Middleware ausgeführt , die Engine führt jedoch weiterhin Beschneidungsanforderungen an die GPU aus , um den sichtbaren Bereich weiter zu beschneiden.

Wozu werden Anforderungen an die GPU abgeschnitten? Der erste Schritt besteht darin, mehrere Gitter der Welt in einem virtuellen Bereich zu gruppieren, der alle diese Gitter abdeckt, gefolgt von einer Anforderung an die GPU, diesen Bereich gemäß dem aktuellen Tiefenpuffer zu rendern. Wenn keines der Rasterpixel die Tiefenprüfung besteht, bedeutet dies, dass dieser Bereich vollständig abgeschnitten ist und alle in diesem Bereich enthaltenen Objekte der Welt beim Rendern ignoriert werden können.

Das Problem ist jedoch, dass die Ergebnisse dieser Clipping-Anforderungen nicht sofort verfügbar sind und die GPU-Pipeline nicht inaktiv sein soll. Sie wird durch diese Anforderungen blockiert. In der Regel werden die Leseergebnisse auf nachfolgende Frames verschoben, sodass Sie einen etwas konservativeren Algorithmus benötigen, um zu vermeiden, dass Objekte auf dem Bildschirm angezeigt werden.


Überprüfen Sie den Bereich. Rot ist abgeschnitten, Grün ist sichtbar.

Cluster-Direkt-Rendering von undurchsichtigen Objekten


Jetzt werden alle undurchsichtigen Geometrien und Abziehbilder gerendert. Die Beleuchtungsinformationen werden in einem Gleitkomma- HDR- Puffer gespeichert :


25% Beleuchtung


50% Beleuchtung


75% Beleuchtung


100% Beleuchtung

Die Tiefenprüffunktionen sind so eingestellt EQUAL, dass unnötige Berechnungen vermieden werden. Dank der vorherigen Vorverarbeitung der Tiefen wissen wir genau, welchen Tiefenwert wir haben sollten jedes Pixel. Abziehbilder werden auch direkt beim Rendern von Gittern angewendet und in einem Texturatlas gespeichert.

Das Bild sieht schon gut aus, aber uns fehlen noch transparente Materialien wie Glas, Partikel und es gibt überhaupt keine Reflexionen des Mediums.

Ich möchte ein paar Worte zu dieser Passage sagen: Sie verwendet einen Cluster-Direct-Renderer, der auf der Arbeit von Emil Persona (Emil Person) und Ola Olsson (Ola Olsson) basiert .

Der Schwachpunkt des direkten Renderns war schon immer die Unfähigkeit, eine große Anzahl von Lichtquellen zu verarbeiten. Diese Aufgabe ist bei verzögerter Schattierung viel einfacher.

Wie funktioniert der Cluster-Renderer? Zunächst wird das Ansichtsfenster in Kacheln unterteilt: In DOOM werden 16 x 8 Bereiche erstellt. Einige Renderer beschäftigen sich damit und berechnen eine Liste von Lichtquellen pro Kachel, wodurch sich das Volumen der Beleuchtungsberechnungen verringern lässt, bei Grenzfällen jedoch bestimmte Probleme auftreten.

Beim Cluster-Rendering wird dieses Konzept vertieft und von 2D auf 3D umgestellt: Ohne das zweidimensionale Ansichtsfenster zu teilen, wird die gesamte Pyramide der Kamerasichtbarkeit dreidimensional aufgeschlüsselt und Schnitte entlang der Z-Achse erstellt.

Jeder „Block“ wird als „Cluster“ bezeichnet " Pyramidenförmige Voxel ."

Unten sehen Sie eine einfache Aufteilung eines 4 x 2-Ansichtsfensters. 5 Tiefenschnitte unterteilen die Sichtbarkeitspyramide in 40 Cluster.



In DOOM pyramidenKammer Einblick in 3072 Cluster (Größe 16 x 8 x 24) unterteilt ist, wurden die Schnitte logarithmisch rasplozhen Tiefe entlang der Achse Z.

Im Fall des gruppierten Renderer typischen Algorithmus ist:

  • Zunächst berechnet die CPU eine Liste von Elementen, die die Beleuchtung in jedem Cluster beeinflussen: Lichtquellen, Abziehbilder und kubische Texturen.

    Dazu werden alle diese Elemente „voxelisiert“, sodass ihr Einflussbereich auf Schnittpunkte mit den Clustern überprüft werden kann. Daten werden in indizierten Listen im GPU-Puffer gespeichert, damit Shader darauf zugreifen können. Jeder Cluster kann bis zu 256 Lichtquellen, 256 Abziehbilder und 256 kubische Texturen enthalten.

  • Dann rendert die GPU das Pixel:

    • Aus den Koordinaten und der Pixeltiefe wird berechnet, zu welchem ​​Cluster er gehört
    • Eine Liste von Abziehbildern / Lichtquellen für diesen Cluster wird gelesen. In diesem Fall wird eine indirekte Adressierung mit Offset- und Indexberechnung verwendet (siehe Abbildungen unten).
    • Der Code durchläuft alle Abziehbilder / Lichtquellen im Cluster und berechnet und addiert den Grad ihres Einflusses.

Verwendung von Lichtern und Abziehbildern
So kann ein Pixel-Shader eine Liste von Lichtern und Abziehbildern in dieser Passage erstellen:












Es gibt auch eine Liste von Sonden (in den obigen Abbildungen nicht dargestellt), auf die auf die gleiche Weise zugegriffen werden kann. Es wird jedoch in dieser Passage nicht verwendet und wir werden später darauf zurückkommen.

Die Kosten für die Beeinflussung der CPU durch die vorläufige Erstellung einer Liste von Elementen für Cluster zahlen sich aus, indem die Komplexität des Renderns von Berechnungen in der GPU in der Pipeline erheblich reduziert wird.

In letzter Zeit wurde dem Cluster-Direkt-Rendering besondere Aufmerksamkeit geschenkt: Es kann mehr Lichtquellen verarbeiten als das einfache Direkt-Rendering. Es funktioniert auch schneller als verzögertes Shading, das aus mehreren G-Puffern schreiben und lesen muss .

Ich habe jedoch nichts erwähnt: In dieser Passage wird nicht nur eine Schreiboperation an den Beleuchtungspuffer übergeben. Wenn es auch mit MRT durchgeführt wird , werden zwei dünne G-Puffer erzeugt:


Normal


Map Reflection

Map Die Normal Map wird im Gleitkomma-Format R16G16 gespeichert , die Reflection Map im Format R8G8B8A8 , der Alphakanal enthält den Glättungskoeffizienten. DOOM verwendet daher sorgfältig eine Kombination aus direktem und verzögertem Rendern mit einem hybriden Ansatz. Diese neuen G-Puffer sind nützlich, wenn Sie zusätzliche Effekte wie Reflexionen hinzufügen.

Ich habe noch etwas übersehen: Gleichzeitig wird ein 160x120-Rückkopplungspuffer für das Megatexture-System erstellt. Es enthält Informationen für das Streaming-System, das über Texturen und deren Mip-Texturierung berichtet, die weitergegeben werden müssen.

Die Megatexture-Engine arbeitet nach dem Prinzip der Rückkopplung: Wenn nach dem Rendern gemeldet wird, dass keine Texturen vorhanden sind, lädt die Engine diese.

GPU-Partikel


Anschließend wird ein Compute-Shader gestartet , um die Partikelsimulation zu aktualisieren: Position, Geschwindigkeit und Lebensdauer.

Es liest den aktuellen Zustand der Partikel sowie Puffer von Normalen und Tiefen (zur Erkennung von Kollisionen), reproduziert die Simulationsstufe und speichert die neuen Zustände in Puffern.

Screen Space Ambient Light (SSAO)


Zu diesem Zeitpunkt wird eine SSAO- Karte generiert .

Es wurde entwickelt, um die Farbe an schmalen Nähten, Falten usw. abzudunkeln.
Es wird auch zum Anwenden von Reflexionsbeschneidungen verwendet , um helle Artefakte zu vermeiden, die bei beschnittenen Gittern auftreten.

Die Karte wird mit der Hälfte der ursprünglichen Auflösung in einem Pixel-Shader berechnet, der Daten aus dem Tiefenpuffer, normalen Karten und Reflexionen liest.

Das erste Ergebnis ist ziemlich laut.


SSAO Karte

Bildschirmreflexionen


Jetzt erstellt der Pixel Shader eine SSR- Karte . Mithilfe der Informationen auf dem Bildschirm werden Reflexionen durch Raytracing verarbeitet, wodurch die Strahlen von jedem Pixel im Ansichtsfenster abprallen und die Farbe der Pixel lesen, auf die die Strahlen treffen.

Tiefen

Normal

Reflexion

Vorheriges Bild

SSR-Karte
Die Eingabedaten für den Shader sind die Tiefenkarte (zum Berechnen der Position eines Pixels im Weltraum), die normale Karte (um zu wissen, wie die Strahlen reflektiert werden), die Reflexionskarte (um den "Betrag" der Reflexion zu kennen) und das zuvor gerenderte Bild (in der Phase vor der Tonkomprimierung). aber nach dem Anwenden von Transparenz, um bestimmte Farbinformationen zu erhalten). Außerdem wird die Kamerakonfiguration des vorherigen Frames an den Pixel-Shader übertragen, sodass Änderungen an den Positionen von Fragmenten verfolgt werden können.

SSR ist eine gute und nicht sehr teure Technik, um dynamische Reflexionen einer Szene in Echtzeit zu erzeugen und eine unveränderliche Last zu erzeugen. es verstärkt das Gefühl des Eintauchens und des Realismus.

Aber sie hat ihre eigenen Artefakte, da sie nur auf dem Bildschirm arbeitet und keine „globalen“ Informationen hat. Sie können zum Beispiel schöne Reflexionen in der Szene sehen, aber wenn Sie anfangen, nach unten zu schauen, nimmt der Reflexionsgrad ab, und wenn Sie auf Ihre Beine schauen, werden Sie fast keine Reflexionen sehen. Es scheint mir, dass SSRs gut in DOOM integriert sind, die Bildqualität verbessern, gleichzeitig aber eher unauffällig sind und Sie ihr Verschwinden nicht bemerken, wenn Sie sie nicht genau befolgen.

Statische kubische Textur Reflexionen


Nachdem Sie alle dynamischen Reflexionen im vorherigen Durchgang (und deren Einschränkungen) berechnet haben, ist es an der Zeit, statische Reflexionen mit IBL zu erstellen .

Diese Technik basiert auf der Verwendung von 128 x 128 kubischen Texturen, die Informationen zur Beleuchtung der Umgebung an verschiedenen Stellen auf der Karte darstellen (sie werden auch als „Umgebungssonden“ bezeichnet). Genauso wie Lichtquellen mit Abziehbildern beim Clustering der Sichtbarkeitspyramide werden die Sonden auch für jeden Cluster indexiert.

Alle kubischen Texturen werden in einem Array gespeichert. Es gibt Dutzende von ihnen, von denen jedoch nur 5 (kubische Texturen in diesem Raum) den Hauptbeitrag zu unserer Szene leisten:
Der Pixel-Shader liest Daten aus Puffern mit Tiefen, Normalen und Reflexionen, sucht nach kubischen Texturen, die sich auf das Pixel in der Clusterstruktur auswirken (je näher die kubische Textur ist, desto stärker ist der Effekt) und generiert eine statische Reflexionskarte:


Statische Reflexionskarte

Kartenmischung


Zu diesem Zeitpunkt kombiniert Compute Shader alle zuvor generierten Karten. Es liest Tiefen- und Reflexionskarten und mischt die direkte Durchgangsbeleuchtung:

  • mit SSAO-Informationen
  • mit einem SSR für das betreffende Pixel, wenn es verfügbar wird
  • Wenn keine SSR-Informationen verfügbar sind, werden statische Reflexionskartendaten als Ersatz verwendet
  • Nebeleffekt wird ebenfalls berechnet


Mischen und Nebel: vor


Mischen und Nebel: nach


Nebel - Nebel, Sondenreflexion - Reflexion der Sonden

Partikelbeleuchtung


In unserer Szene gibt es Rauchpartikel und die Beleuchtung wird für jedes Sprite berechnet. Jedes Sprite wird so gerendert, als wäre es im Weltraum: Aus seiner Position erhalten wir eine Liste der Lichtquellen und der zugehörigen Schattenkarten, woraufhin die Beleuchtung eines Vierecks (Partikels) berechnet wird. Das Ergebnis wird dann in einem 4k-Atlas gespeichert. Kacheln können je nach Abstand der Partikel zur Kamera, Qualitätseinstellungen usw. unterschiedlich groß sein. Der Atlas verfügt über spezielle Bereiche für Sprites mit einfacher Auflösung. So sehen Sprites mit 64 x 64 Pixeln aus:


Partikelbeleuchtungsatlas

In einer so niedrigen Auflösung werden nur Beleuchtungsinformationen gespeichert. Später, wenn das Partikel tatsächlich gezeichnet wird, wird die Textur in voller Auflösung verwendet und der Maßstab des Beleuchtungsvierecks nimmt zu und es mischt sich mit der Textur.

Hier trennt DOOM die Berechnung der Partikelbeleuchtung von der Hauptdarstellung des Spiels: Egal welche Auflösung Sie spielen (720p, 1080p, 4k ...), die Partikelbeleuchtung wird immer berechnet und in so kleinen Kacheln fester Größe gespeichert.

Verkleinern und verwischen


Die Szene wird mehrfach auf 40 Pixel verkleinert. Die kleinsten Zoomstufen werden durch separate vertikale und horizontale Übergänge verwischt (es wird eine „Unschärfekette“ erstellt).



Warum so früh verwischen? Dieser Vorgang findet normalerweise am Ende der Nachbearbeitung statt, um in hellen Bereichen einen Blüteeffekt zu erzielen.

Aber all diese unterschiedlichen Unschärfen sind im nächsten Abschnitt nützlich, um Brechungen in Gläsern wiederzugeben.

Transparente Objekte


Alle transparenten Objekte (Gläser, Partikel) werden über der Szene gerendert:


Transparente Objekte: Vorher


Transparente Objekte:

Nachher Gläser werden in DOOM sehr schön gerendert, insbesondere mit Frost oder Schmutz bedeckte Gläser: Abziehbilder wirken nur auf einen Teil des Glases und lassen die Lichtbrechungen mehr oder weniger verschwimmen. Der Pixel-Shader berechnet den Brechungskoeffizienten "Unschärfe" und wählt zwei Karten aus dem Satz "Unschärfekette" aus, die dem Unschärfekoeffizienten am nächsten liegen. Er liest diese beiden Karten und interpoliert die beiden Werte linear, um die endgültige Farbe der Brechungsunschärfe zu approximieren. Dank dieses Prozesses können Brillen Pixel für Pixel schöne Lichtbrechungen bei verschiedenen Unschärfegraden erzeugen.

Verzerrungskarte



Verzerrungskarte

Sehr heiße Bereiche können zu thermischen Verformungen im Bild führen. In unserer Szene verzerrt ein Nest aus Blut das Bild ein wenig.

Verzerrungen werden relativ zum Tiefenpuffer gerendert, um eine Verzerrungskarte mit niedriger Auflösung zu erstellen.

Der rote und der grüne Kanal repräsentieren den Verzerrungswert entlang der horizontalen und vertikalen Achse. Der blaue Kanal enthält die Menge der angewendeten Unschärfe.

Der echte Verzerrungseffekt wird später wie bei der Nachbearbeitung mithilfe einer Verzerrungskarte angewendet, um die gewünschten Pixel zu verschieben.

In dieser Szene ist die Verzerrung sehr gering und nahezu unsichtbar.

Benutzeroberfläche




Die Benutzeroberfläche wird in einem vorvervielfachten Alpha-Modus , der im LDR- Format gespeichert ist, in einem anderen Rendering-Puffer gerendert .

Der Vorteil des Speicherns der gesamten Benutzeroberfläche in einem separaten Puffer, anstatt direkt über dem fertigen Frame zu zeichnen, besteht darin, dass das Spiel für alle Benutzeroberflächen-Widgets in einem Durchgang eine Filterung / Nachbearbeitung durchführen kann, z. B. chromatische Aberration oder optische Verzerrung.

Das Rendern verwendet keine der Stapelverarbeitungstechniken und zeichnet einfach eines nach dem anderen der Schnittstellenelemente in etwa 120 Zeichenaufrufen.

In den folgenden Durchläufen wird der UI-Puffer über dem Spielbild gemischt, um das Endergebnis zu erzielen.

Temporäres Anti-Aliasing (TAA) und Bewegungsunschärfe


TAA und Bewegungsunschärfe werden unter Verwendung der Geschwindigkeitskarte und der Rendering-Ergebnisse des vorherigen Frames angewendet.

Fragmente können verfolgt werden, sodass der Pixel-Shader weiß, wo sich das aktuell verarbeitete Pixel im vorherigen Frame befand. Bei jedem zweiten Frame wird beim Rendern die Projektion der Raster geringfügig um ein halbes Pixel verschoben. Auf diese Weise werden Artefakte der Subpixel-Verzerrung eliminiert.


TAA und Bewegungsunschärfe: vor


TAA und Bewegungsunschärfe: nach

Das Ergebnis ist sehr gut: Nicht nur das Gitter wird geglättet, sondern auch die Verzerrung von Reflexionen (bei denen separate helle Pixel im Rahmen auftreten können) wird reduziert. Die Qualität ist viel besser als mit der FXAA-Nachbearbeitungsmethode.

Szenenhelligkeit


In diesem Stadium wird die durchschnittliche Helligkeit der Szene berechnet . Dies ist einer der Parameter, die später für die Tonkomprimierung übertragen werden.

Der HDR-Beleuchtungspuffer verringert sich zyklisch von seiner Auflösung um die Hälfte, bis er zu einer 2 x 2-Textur wird. Bei jeder Iteration wird der Pixelfarbwert als Durchschnitt der Helligkeit seiner vier "übergeordneten" Pixel aus einer größeren Karte berechnet.

Blüte



Bloom

Ein Luminanzfilter wird angewendet, um die dunkelsten Bereiche des Bildes stumm zu schalten. Das Ergebnis der Verwendung eines Helligkeitsfilters wird dann in ähnlicher Weise wie oben beschrieben zyklisch reduziert und verwischt.

Die Ebenen werden mithilfe der in vertikale und horizontale Übergänge unterteilten Gaußschen Unschärfe verwischt , bei der der Pixel-Shader den gewichteten Durchschnittswert entlang einer Achse berechnet.

Die verschwommenen Schichten werden dann kombiniert, um einen Blüteffekt zu erzeugen , der eine HDR-Textur aufweist, die viermal kleiner als die ursprüngliche Auflösung ist.

Letzte Nachbearbeitung


Dieser gesamte Schritt wird in einem einzelnen Pixel-Shader ausgeführt:

  • Die thermische Verformung wird unter Verwendung von Verzerrungskartendaten angewendet
  • Die Blütentextur wird über dem HDR-Beleuchtungspuffer hinzugefügt
  • Effekte wie Vignettierung, Schmutz / Blendung anwenden
  • Die durchschnittliche Helligkeit wird durch Abtasten einer 2x2-Helligkeitskarte berechnet, und es werden zusätzliche Belichtungsparameter, Tonkomprimierung und Abstufung verwendet.


Tonkomprimierung: vor


Tonkomprimierung: nach

Tonkomprimierung wird ein HDR-Beleuchtungspuffer mit Farben verwendet, die sich über einen großen Helligkeitsbereich ändern, und in Farben mit 8 Bit pro Komponente (LDR) konvertiert, damit der Rahmen auf dem Monitor angezeigt werden kann.

Filmische Tonwertabbildung Operator basierend auf einer Gleichung (x(Ax+BC)+DE) / (x(Ax+B)+DF) - (E/F), diese Klangkompressions Uncharted 2 wird auch angewandt GTA V .

Es sollte auch beachtet werden, dass der Gesamtrotstich der Szene durch Farbkorrektur erhalten wird.

UI und Filmkorn


Schließlich befindet sich die Benutzeroberfläche ganz oben auf dem Spielfeld. Gleichzeitig wird ein leichter Filmkörnungseffekt hinzugefügt .


UI und Korn: vor


UI und Korn: nach

Und wir haben die Verarbeitung des Rahmens abgeschlossen, es ist bereit für die Übertragung auf den Monitor zur Anzeige; Viele Berechnungen wurden durchgeführt, aber alles geschah in weniger als 16 Millisekunden.

DOOM schafft es, mit hoher Geschwindigkeit ein qualitativ hochwertiges Bild zu erstellen, da es die alten Daten, die in den vorherigen Frames berechnet wurden, mit Bedacht verwendet. Insgesamt haben wir 1331 Draw Calls, 132 Texturen und 50 Rendering Buffer.

Bonus Informationen


Mehr über Brillen


Das Glasputzergebnis ist sehr gut; Es wurde jedoch auf ziemlich einfache Weise erreicht, wie wir oben untersucht haben:

  • подготовка нескольких уровней размытия рендеринга непрозрачных сеток
  • отрисовка просвечивающих элементов в порядке «сзади вперёд» в прямом режиме с применением декалей/освещения/отражения зондов с помощью предыдущей цепочки для различных значений размытия преломления стекла; при этом каждый пиксель может получить собственное значение преломления.


Стекло: до


Стекло: после

Глубина резкости


Die Schärfentiefe ist in dem von uns untersuchten Rahmen nicht sichtbar. Schauen wir uns also die folgende Szene vor und nach ihrer Anwendung an:


Schärfentiefe: bis


Schärfentiefe: nach

Nicht bei allen Spielen wird die Schärfentiefe korrekt verwendet: Der naive Ansatz besteht häufig darin, Gaußsche Unschärfe zu verwenden und Unschärfe in einer zu machen passieren je nach Pixeltiefe. Dieser Ansatz ist einfach und wirtschaftlich, weist jedoch einige Probleme auf:

  • Gaußsche Unschärfe ist gut für den Blüteeffekt, sie erzeugt Bokeh nicht richtig : Sie benötigen eine flache Mitte, damit sich das Licht eines hellen Pixels über die gesamte Scheibe oder das gesamte Sechseck ausbreitet. Gaußsche Unschärfe ist nicht in der Lage, schöne Bokeh-Formen zu erzeugen.
  • Das Anwenden der Schärfentiefe in einem Schritt eines Pixel-Shaders kann leicht zu Artefakten an den Rändern führen.

In DOOM wird die Schärfentiefe korrekt angewendet. Nach meiner Erfahrung wurde einer der Ansätze ausgewählt, mit denen sich die besten Ergebnisse erzielen lassen: Es werden Bilder mit einer großen und einer kleinen Schärfentiefe erstellt: Die Auswahl der Pixel erfolgt in Abhängigkeit von ihrer Schärfentiefe und den Parametern der Schärfentiefe.

  • Ein Bild mit geringer Tiefe kann sehr unscharf sein. Je mehr es sich in die dahinter liegenden Pixel „ausbreitet“, desto besser.
  • Ein Bild mit einer großen Tiefe ist ebenfalls unscharf, liest jedoch keine Pixel aus dem fokussierten Bereich / der geringen Schärfentiefe, sodass Probleme mit Objekten im Vordergrund vermieden werden, die sich fälschlicherweise auf den Hintergrund „ausbreiten“.

Um eine Bokeh-Unschärfe zu erzeugen, arbeitet DOOM mit halber Auflösung und führt eine kreisförmige Unschärfe mit 64 Texturüberlagerungen durch. Jedes Fragment hat das gleiche Gewicht, sodass sich die Helligkeit im Gegensatz zur Gaußschen Unschärfe wirklich ausbreitet.
Der Durchmesser des Kreises kann in Abhängigkeit vom Wert des Pixelstreupunkts pixelweise variieren .

Dann breitet sich das Bokeh mit einer Unschärfe von 16 Überlagerungen weiter aus, aber dieses Mal wird der gewichtete Durchschnittswert nicht berechnet, sondern die Werte der Proben werden einfach akkumuliert und der größte Wert der benachbarten Überlagerungen wird gespeichert. Dies verlängert nicht nur die erste Unschärfe, sondern beseitigt auch kleine Artefakte (Lücken in der Abtastung) des ersten Durchgangs. Der letzte Teil des Algorithmus wird aus der aufgenommenen Arbeit von Mackintosh (McIntosh).

Diese Technik des Iterierens über mehrere Durchläufe hinweg ermöglicht es Ihnen, sehr schöne, große Unschärfen zu erzielen und gleichzeitig die Leistung zu verbessern. Die Anzahl der Texturüberlagerungen pro Pixel ist angesichts des großen Radius der resultierenden endgültigen kreisförmigen Unschärfe immer noch recht gering.


Große Schärfentiefe


Große Schärfentiefe und Unschärfe 1


Große Schärfentiefe und Unschärfe 1 und 2

Schließlich werden Bilder mit großer und geringer Schärfentiefe der Originalszene mit Alpha-Blending überlagert, um den endgültigen Tiefenschärfeeffekt zu erzielen. Dieser Durchgang wird unmittelbar vor dem Anwenden der Bewegungsunschärfe ausgeführt.

Zusätzliche Quellen


Wenn Sie tiefer in die Technologie von idTech 6 eintauchen möchten, gibt es glücklicherweise viele Vorträge und Veröffentlichungen zu diesem Thema:


Jetzt auch beliebt: