ich versuche gerade meine Beleuchtungsengine ein wenig zu verbessern. Ich rendere ja meine Lichtkegel indem ich Quads + Shader (Schatten und Beleuchtung) als Kegel rendere. Sieht auch wirklich gut aus. Nun wollte ich vorbeiziehende Nebelschwaden damit multiplizieren.. Doch das Problem ist die Perspektive. Aktuell hab ich einfach komplett über die Szene eine Nebeltextur drüberziehen lassen, doch diese ändert sich ja nicht mit der Camera..
Wie könnte man sowas gescheit lösen? Ich dachte schon an mehrere "unsichtbare" quads eins auf X, Y, und Z ebene wo über all die Textur in eine Richtung drüber läuft, doch das sieht bestimmt komisch aus..
Registriert: Mo Nov 08, 2010 18:41 Beiträge: 769
Programmiersprache: Gestern
spontan: ich würde für jeden Nebel ein Polyeder konstruieren und im Shader kucken ob und wie weit mein Punkt im Nebel ist..... Textur koordinaten kannst du dann im shader aus der Position deines Punktes und der Zeit errechnen ... sollte ziehmlich schön Random aussehen
Ich hab' sowas vor eingier Zeit mal gemacht. Theoretisch wäre es am physikalisch korrektestem, wenn man für jeden Pixel einen Strahl durch ein 3D Textur schickt und die dabei getroffenen Texel zusammenrechnet um die Dichte des Nebels zu erhalten. Allerdings ist das ein bischen aufwändig.
Bei mir hab' ich es deshalb so gemacht: Der Nebel hat ein bestimmte Position im Raum, die per Uniformvariablen an den Shader übertragen wird. Aus der Kameraposition kann man die Position im Nebelvolumen errechnen, wodurch man 3D-Texturkoordinaten erhält. Für jedes Pixel nimmt man dann die Richtung im Worldspace und berechnet in welche Richtung es in der Nebeltextur zeigt (beide können gleich sein, wenn die Nebeltextur an den Achsen ausgerichtet ist). Aus der Position und der Richtung wird dann mithilfe eines konstanten Kreisradius ein weiterer Punkt in der Textur berechnet. Somit erhält man eine Punkteschar die auf einem Kreis in der Textur um die Texturkoordinaten der Kameraposition liegt. Diese Punkte entsprechen den Texturkoordinaten die man für die Dichte des Nebels an der Stelle nimmt. Außerdem kann man entweder aus einer weiteren Textur oder der Position im Nebelvolumen eine lokale Abschwächung berechnen (z.B. wenn man nah am Rand des Nebels ist).
Das ganze funktioniert allerdings nur, wenn man selbst im Nebel ist. Für Positionen außerhalb verwende ich einfach einen Punkt auf der Oberfläche des Nebelvolumens um die Texturkoordinaten zu errechnen. Beim Übergang von innen nach außen werden dann beide Werte interpoliert.
Leider sieht der 2te Teil noch nicht ganz so gut aus.
mhhh das ganze hört sich ziemlich aufwändig an. Hauptaugenmerk bei meiner Animation liegt bei der Beleuchtung (>200 Spotlights mit Schatten etc). Da darf der Nebel nicht viel kosten und sollte vielmehr eine optische verbesserung darstellen.
Andere Progs kriegen das auch ohne große performanceeinbußen hin.. also irgendwie muss das machbar sein. Ich dachte schon an ein paar vorbeiziehende Pointsprites, aber hab noch nicht ganz zuende gedacht...
Hier mal ein Bildchen wie es aktuell aussieht
Dateianhang:
Unbenannt-1.jpg
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Registriert: Mo Nov 08, 2010 18:41 Beiträge: 769
Programmiersprache: Gestern
also ... dein Nebel befindet sich ja höchstwahrscheinlich in einen primitiven Volumen (z.B. ein Polyeder), die Ebenen davon kannst du als Parameter an deinen Shader übergeben. Da du ja für jeden Pixel auf dem Bildschirm die Position weißt überprüfst du nun ob der betroffene Pixel im Volumen liegt (einfach überprüfen ob er für jede Ebene auf der Rückseite? liegt). Ist ein Pixel in diesen Volumen so errechnet sich der Alphakanal deines Nebels aus dem geringsten Abstand zu den Ebenen. Für die eigentliche Farbe des Nebels zeichnest du am besten ein Fraktal in eine Textur und machst dann sowas in der Art hier: Col = Texture2D(Fraktal, normalize(Pixel.pos).xy*sin(Zeit));
Alternativ kannst du auch davon ausgehen das Nebelvolumen und Lichtkegel gleich sind wodurch du wieder was einsparst, hättest dann aber Probleme wenn der Nebel und Lichtquelle sich unabhängig voneinander bewegen sollen.
Eine weitere Methode wäre es einen extra Renderpass für Partikel anzulegen und diesen zu Beleuchten....
Also ich hab jetzt einfach mal Versucht meinem Lichtkegel direkt die Nebeltextur zuzuweisen, diese Bewegt sich richtung der Lichtquelle. Die Textur wird dann mit dem Licht im Shader multipliziert und siehe da es sieht wirklich realistisch aus.... Auf einer Bühne weht der Nebel ja auch nicht überall in eine Richtung, denn die Maschinen stehen ja überall rum, von daher ist das auch realistisch..
Hätte ja mal ein Bild gepostet aber das wirkt nur in echtzeit wenn der nebel vorbeizieht
Registriert: Mo Nov 08, 2010 18:41 Beiträge: 769
Programmiersprache: Gestern
Thmfrnk hat geschrieben:
indirekte Beleuchtung wie meinst du das? Es ist nur da licht wo der Lichtkegel ist und auch nur da siehst den vorbei ziehenden Nebel.
Weiß ja nicht wie realistisch du das ganze halten willst, aber in der Natur ist es so das ein Teil des Lichtes immer absorbiert und ein anderer Teil reflektiert wird (stell dir einfach eine Wand als kurzsichtigen Spiegel vor ) von daher wird ein Teil deines Nebels immer sichtbar sein, egal ob er direkt angestrahlt wird oder nicht da er immer ein paar photönchen abgebekommt.
Mitglieder in diesem Forum: 0 Mitglieder und 4 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.