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:
(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.
glFogCoord
Erweiterung in OpenGL das auch erlaubt . Obwohl es begrenzt klingt: Es ist entweder bodenbasiert oder entfernungsbasiert.Antworten:
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.
quelle