Eignung des Bodennebels mit geschichteten Alpha-Quads?


16

Ein geschichteter Ansatz würde eine Reihe von massiven Quadern mit Alpha-Textur verwenden, die parallel zum Boden angeordnet sind und alle dazwischenliegenden Geländegeometrien schneiden, um die Illusion von Bodennebel von oben, von unten und etwas weniger effektiv zu erzeugen, wenn sich der Nebel im Inneren befindet Blick zum Horizont (siehe Bild unten).

Alternativ würde ein primär Shader-basierter Ansatz stattdessen die Dichte als Funktion der Sichtentfernung in das Bodennebelsubstrat berechnen und den Fragmentwert darauf basierend ausgeben.

Ohne jeden Ansatz selbst einer Leistungsprüfung unterziehen zu müssen , möchte ich zunächst die Erfahrungen anderer hören (keine Spekulationen!), Welche Auswirkungen der mehrschichtige Alpha-Textur-Ansatz auf die Leistung haben dürfte. Ich frage speziell aufgrund der oft zitierten Auswirkungen von Überziehung (nicht sicher, wie stark die Auslastung Ihres durchschnittlichen Desktopsystems ist). Eine Liste von Spielen, die diesen Ansatz verwenden, insbesondere ältere Spiele, wäre immens nützlich: Wenn dies auf einer Hardware vor DX9 / OpenGL2 möglich wäre, würde es wahrscheinlich gut für mich funktionieren.

Eine große Frage betrifft diese Art von Effekt:

Bildbeschreibung hier eingeben

(Bildnachweis geht an Lume von lume.com)

Beachten Sie, dass die vertikale Nebelabstufung kontinuierlich / gleichmäßig ist. OTOH, mit texturierten Quad-Schichten, kann ich nur annehmen, dass Schichten beim Durchlaufen mächtig offensichtlich wären - je spärlicher sie waren, desto offensichtlicher wäre dies. Dies steht im Gegensatz zu Nebelebenen, die so ausgerichtet sind, dass sie dem Spieler in jedem Frame zugewandt sind, in dem diese Grobheit viel weniger offensichtlich wäre.


1
Warum würden Sie wollen Alpha Quad Schichten für diesen Einsatz? Der "Shader-Heavy-Ansatz" ist nicht nur genauer, sondern auch nicht gerade als langsam bekannt .
Nicol Bolas

1
@StephanvandenHeuvel Sicher, aber das ist sichtraumorientierter, entfernungsbasierter Nebel. Nicht bodenrichtiger Nebel. Richtig?
Ingenieur

1
@ NickWiggill Ja, Sie sind richtig.
Stephan van den Heuvel

1
IIRC hatte die Wii bodenrichtigen Nebel in ihrer (halb-) festen Pipeline. Anscheinend hat die glFogCoordErweiterung in OpenGL das auch erlaubt . Obwohl es begrenzt klingt: Es ist entweder bodenbasiert oder entfernungsbasiert.
Laurent Couvidou

1
Quake 3 hat etwas Ähnliches getan und dabei einen Fixed-Pipeline-Ansatz verwendet, der mit GL1.1 funktioniert hat. Die große Sorge, die ich hätte, ist, dass sich Fillrate / Overdraw möglicherweise stark anhäuft, aber es lohnt sich wahrscheinlich, den Q3-Quellcode herunterzuladen und ihre Implementierung zu überprüfen. Möglicherweise tun Sie nicht genau das Gleiche, aber es kann Ihnen zumindest bei der Entscheidungsfindung helfen.
Maximus Minimus

Antworten:


15

Da du nach Erfahrungen gefragt hast, sind hier meine.

In den Tagen, in denen ich PS2-Spiele programmierte, war der "Layered Alpha Quads" -Ansatz ein Weg, wie wir Nebel oft implementierten. Gelegentlich als Bodennebel, aber viel häufiger als Vollbildnebel. Und es hat in beiden Fällen gut funktioniert. Also ja, es war in den Tagen vor dem Fragment-Shader lebensfähig.

Naja, so ungefähr. Wie Sie bemerkt haben, bestand das Problem darin, dass Sie eine absurde Anzahl von Alpha-Quads benötigen, wenn Sie einen gleichmäßigen Nebel wie im Screenshot sehen möchten.

Auf der PS2 konnten wir uns normalerweise drei bis fünf Schichten leisten. Was definitiv aussah wie "Mauern" aus Nebel, die vor dir schwebten. Mehr als das und die Füllrate begannen unsere Bildrate zu töten.

Normalerweise werden diese Quads in festgelegten Abständen vor der Kamera gezeichnet, sodass Sie nie die von Ihnen erwähnte Situation bekommen, in der Sie durch einen von ihnen "gehen". Auf der anderen Seite, durch diese festen Abständen, alles andere in der Welt mit tutGehen Sie durch diese Ebenen, während sich der Spieler bewegt. Dies ist ein ziemlich offensichtlicher Grafikfehler. Fast jeder hat es damals gemacht, aber es wäre jetzt nicht akzeptabel (es sei denn, Sie taten es aus stilistischen Gründen). (Ausnahme: Einige Leute berechneten Nebelwerte als Teil des PS2-Äquivalents eines Vertex-Shaders. Das funktionierte und war viel schneller, erforderte jedoch eine hohe Tesselation Ihrer Modelle. Lange Wände konnten Sie beispielsweise nicht haben, weil nur Nebel vorhanden war B. an den Ecken der Wand berechnet und dann über die gesamte Fläche der Wand herumgeschmiert werden. Die Wand schien voll beschlagen zu sein, wenn Sie direkt neben ihrer Mitte standen, da sie nur die Nebelschwelle an ihrer Wand testete Endpunkte)

Beachten Sie, dass, wenn Sie Nebelquads statisch in der Welt platzieren (wie Sie als Möglichkeit erwähnen), Sie nicht in der Lage sind, das Aussehen eines extrem glatten Nebels zu erhalten, wie in dem von Ihnen bereitgestellten Bild - es kommt zu merkwürdigen Überlappungen zwischen benachbarte Quads abhängig von der Ausrichtung des Betrachters. Diese Überlappungen können als Streifen oder Trapez (wenn die Quads nicht texturiert sind) oder als Klumpen (wenn sie texturiert sind) angezeigt werden.

Nehmen wir jedoch an, wir verwenden breite Quads mit Bildschirmausrichtung, um diesen Bodennebel zu erzeugen, und führen einige Berechnungen durch, um mit dieser Methode einen wirklich gleichmäßigen Nebel auf ebenem Boden mit einer Kamera zu erzeugen, die geradeaus schaut - das ist unsere ideale Situation . Nehmen wir an, die HD-Auflösung beträgt 1920 x 1080, wodurch unser Horizont auf Scanline 540 eingestellt wird. Nehmen wir auch an, wir haben Sicht bis zum Horizont (vorausgesetzt, der Nebel erreicht nicht die volle Deckkraft, bevor wir den Horizont erreichen). Wenn ein Nebelvierer an jeder Scanlinie startet und einer anhält (um gleichmäßigen Nebel zu erhalten), benötigen wir (540 * 2 ==) 1080 Nebelquads. Jeder dieser 1080 Nebelquads bedeckt die gesamte horizontale Fläche des Bildschirms.

Nehmen wir an, dass eine Nebelebene im Durchschnitt etwa 300 Pixelzeilen abdeckt. Die nächstgelegenen decken weniger ab, die am weitesten entfernten decken weniger ab, die mittleren Reihen decken viel mehr ab.

Mit dieser Schätzung erhalten wir (1920x300 ==) 576.000 Pixel, die vom durchschnittlichen Nebelquadrat berührt werden. Insgesamt sind das (576.000 * 1080 ==) 622.080.000 Pixel, die insgesamt für den gesamten Effekt "Glatter Nebel durch Rendern von vielen durchscheinenden Geometrien" berührt werden. Und diese Zahl wird für Leute mit einer höheren Auflösung steigen. Darüber hinaus erhalten wir die gleiche Anzahl von Tests für den Z-Buffer und nahezu die gleiche Anzahl von Pixel-Mischoperationen, da all diese transparenten Ebenen immer wieder übereinander gezogen werden. Das sind viele Pixel.

Und das ist das beste Szenario - Sie erhalten eine weitaus größere Bildschirmabdeckung der Nebelquads, wenn der Benutzer nach unten schaut oder sich hockt.

Beachten Sie, dass wir, da wir 1080 Quads überlappen, wahrscheinlich einen Alpha-Wert von etwa (1,0 / 1080 ~ =) 0,0009 für jedes Quad festlegen möchten, damit unser Nebel die volle Opazität erreicht, wenn Sie alle 1080 Quads durchsehen. (Wir könnten darüber hinaus gehen, aber dies ist der Wert, der voraussetzt, dass wir den Bereich so weit wie möglich verteilen möchten.) Beachten Sie, dass dieser Wert nicht als Alpha-Komponente eines 32-Bit-Farbwerts dargestellt werden kann (256 * 0,0009 ~ = 0,237) und daher auf 0 abgerundet wird, wenn Sie es versuchen. Sie müssen OpenGL den Wert 0,0009 als Gleitkommawert bereitstellen, damit dies überhaupt funktioniert. (Beachten Sie auch, dass Sie nicht bei jedem den gleichen Wert festlegen möchten - während wir definiert haben, dass auf jeder Scanlinie unterhalb des Horizonts ein Quad beginnen und eines enden soll, um einen gleichmäßigen Nebel zu erzeugen.

Beachten Sie auch, dass die Nebelmischungen bei diesem Ansatz nicht ganz richtig funktionieren, wie dies bei einem modernen Shader der Fall wäre. Statt einer Berechnung von "Mischung zwischen der Basisobjektfarbe und der Nebelfarbe unter Verwendung dieses Prozentsatzes" erhalten Sie 1080 Berechnungen von "Mischung zwischen der bisherigen Farbe und der Nebelfarbe durch den Nebelprozentsatz". Dies bedeutet, dass der Nebel Objekte nach einem logarithmischen Abfall beeinflusst. (Das heißt, ein Objekt, das von 20 Nebelquads betroffen ist, erscheint weniger als doppelt so beschlagen wie ein Objekt, das von 10 Nebelquads betroffen ist, da die ersten Nebelquads beim Mischvorgang einen stärkeren Einfluss haben.)

Das alles heißt: Bitte verwenden Sie nur einen Fragment-Shader.

Nicht wirklich. Es ist einfacher und billiger sowie schneller und schneller zu implementieren und ist weniger fehleranfällig. Sie können Ihr Spiel nun wieder herstellen und es ist in jeder Hinsicht besser. Wir hätten es schon in der PS2-Ära getan, wenn es damals nur vage möglich gewesen wäre.


1
+1 für umfassende Antworten basierend auf Erfahrungen aus der Praxis.
concept3d

3
Als ich vor einem Jahr und einem Monat diese Frage schrieb, war ich immer noch bereit, Hühnchen mit Füllraten zu spielen. Jetzt würde ich mich für eine grobe 3D-Textur entscheiden, um Bodennebelvolumina mit ständig wechselnden Dichten darzustellen, die beispielsweise durch 3D-Perlin-Rauschen bestimmt werden, und diese dann als Grundlage für Bildschirmraumeffekte verwenden, wie Sie vorgeschlagen haben.
Ingenieur
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.