Hi. Wie könnte man "dynamisches" Environment Mapping realisieren? Ich habe z.B. Wasser und will da drauf die Umgebung spiegeln, ohne eine festgelegte Textur zu benutzen, also wie bei HL². Hat da jemand eine Idee?
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
Sowas geht eigentlich am besten über eine dynamische Cubemap, gepaart mit nem Vertex- und nem Fragmentprogramm. Aber besonders einfach ist das nicht, und das Aktualisieren der sechs Cubemap-Flächen ist auch sehr performanceraubend. Evtl. solltest du zuerst mit ner statischen Reflektion von z.B. deiner Skybox vorlieb nehmen.
Bei einer fast ebenen Fläche wie Wasser, kann man auch die Kamera an der Ebene spiegeln, das Spiegelbild in eine Texture rendern und diese Texture dann auf die Wasseroberfläche projektieren. Dabei kann man die Texture natürlich noch mit einer Bumpmap verzerren.
Damit Wasser echt aussieht muß man auch dafür sorgen, daß das Bild unter dem Wasser auch durch die Bumpmap verschoben wird. Dafür rendert man alles unter dem Wasser am besten auch in eine Texture.
Je nach Blickwinkel auf die Wasserebene überblendet man dann zwischen der Spiegeltexturen und der Texture mit dem gebrochenen Bild.
Wenn man flach auf das Wasser sieht, kann man fast gar nicht hindurch sehen und die Spiegelung überwiegt. Zur Spiegelung der Kameraposition gibt es zur Zeit bei gamedev.net einen Artikel.
Zuletzt geändert von LarsMiddendorf am Di Dez 16, 2003 17:23, insgesamt 1-mal geändert.
Ich hatte auch schon darüber nachgedacht das zu machen wie in eurem "Render To Texture" Beispiel. Also die Szene von einer bestimmten Ansicht zu rendern und als eine Environment Map auf das Wasser zu packen. Wäre das auch möglich? Oder hat vllt. jemand eine andere Idee dies zu realisieren? Sollte ja nur so echt wie möglich aussehen. Reicht auch wenn dies ein "Fake" wäre aber halt am besten ohne, dass ich jedes mal wenn ich das Level ändere, eine neue Envmap zu erstellen.
Die Szene in eine Textur rendern und dann anzeigen hab ich mir auch schonmal so gedacht. Das Problem ist find ich jedoch, dass ich nicht weiß an welche stelle die kamera sich befinden muss, bzw wo sie hingucken muss, wenn das in ne Textur gerendert wird. Hat da jemand ne Idee?
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Die Kamera muss gerade in diese Richtung schauen? Also vom Mittelpunkt aus nur in die entsprechende(n) Richtung(en) drehen. Würde ich mal so sagen. Habe das zwar auch noch nicht gemacht aber alles andere ist eher unlogisch.
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
Warum machste das denn nicht per Cubemap wie ich vorgeschlagen hab? Geht doch ganz einfach : Du renderst die sechs Cubemapseiten aus der Mittelposition deiner Wasserfläche (natürlich ohne die Wasserfläche) und kopierst diese sechs Ansichten dann in deine Cubemaptexturen, dann musst du nur noch Cubemapping aktivieren (siehe dazu mein Tutorial) und schon hast du ne richtig schöne und v.a. korrekte Spiegelung deiner Umgebung, die sogar dynamisch sein kann...ne bessere und einfachere Methode gibts kaum.
hm ist es wirklich sinvoll um auf einem kleinen polygon zum Beispiel eine sache zu spiegeln, ne Cubemap zu benutzen? Das ist dann zwar schön, aber doch bestimmt nicht schnell, oder? Weil 6 Texturen um auf einem Polygon zu spiegeln ist doch eigentlich nicht nötig. Das müsste auch mit nur einer Textur gehen.
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
Nein, Cubemapping läuft doch in Hardware ab und ist daher auch auf älterer Hardware schnell und wird besonders in ner Szene in der noch viele andere Sachen gezeigt werden kaum an der Gesamtleistung zehren. Und darüberhinaus kann man Reflektionen wie berets erwähnt weder viel einfacher noch viel performanter realisieren.
In 6 Cubemap Texturen zu rendern dürfte aber eigentlich langsamer sein, als in eine Texture zu rendern und die dann auf die Wasseroberfläche zu projektieren. Was anderes ist das natürlich mit vorherberechneten Cubemaps wie in UT2003.
Wenn man ein komplexes Objekt mit vielen verschiedenen Normalen hat, dann macht die Cubemap Sinn. Aber bei einer Wasseroberfläche reicht doch auch eine Texture.
Mal ne Frage: Wenn man ne Cubemap anzeigt, rechnet die Grafikkarte das dann SOFORT fertig, oder dauert das dann etwas? Kann ich mir igendwie nicht vorstellen das der das sofort fertig hat.
Das ist nicht sofort fertig, aber die Befehle werden alle in der richtigen Reihenfolge bearbeitet. Wenn du wissen möchtest, wann ein bestimmter GL Befehl verarbeitet wurde, kannst du auf GF Karten einen Fence(NV_fence) hinter dem Befehl in die Befehlsreihe einfügen und prüfen, ob er schon erreicht worden ist.
Auf anderen Karten könnte man in bestimmen Fällen ersatzweise ARB_occlusion_query benutzen, aber eigentlich ist es gar nicht nötig festzustellen, ob ein Befehl fertig ist.
Ich habe mal eine kleine Demo zusammengestellt, die genau das macht: 6 Cubemapflächen für "echte" Reflektionen zu berechnen.
Wer die Cubemap als Skybox dargestellt haben möchte, sollte den Kommentar vor folgender Zeile deaktivieren (in der .dpr Datei):
// bgBoundSkyBox := DynTexCubemap;
BaseGraph erstellt für dynamisches ECM einen Satz Proxy-Texturen und lädt dann die entsprechenden Bilder mittels glCopyTexSubImage2d in die Texture, was meines erachtens der schnellste Weg sein dürfte, wenn RenderToTexture nicht möglich ist (außerdem braucht man so keinen Wechsel des Gerätekontexts, der bei RenderToTexture auch etwas bremsen dürfte).
Das Ganze könnte man natürlich bombastischer machen - ich denke aber, das Prinzip sieht man recht gut - insbesondere wenn man die berechnete Cubemap als Sykbox projezieren lässt.
Der Nachteil dieser Methode ist übrigens, dass pro reflektierendem Objekt eine eigene Cubemap berechnet werden müsste, was die Brauchbarkeit also auf einige wenige Special Effects beschränkt.
Wie man sieht, vertragen sich OpenGL Beleuchtung und berechnete Cubemaps ebenfalls nicht besonders gut (und das obwohl die Lichtquelle eigentlich neu berechnet werden würde - vielleicht liegt es aber auch nur an den ATI 9000 Treibern).
Aber wenn die Cubemap berechnung etwas dauert dann ist das was son of satan gesagt hat ja eigentlich falsch, weil wenn man zum beispiel ein so'n cubemap teil darstellt und direkt danach angibt, dass er noch ein paar andere polygone zeichnen soll, dann ist das ja doch langsamer als wenn man die cubemap berechnung weglässt, oder seh ich das falsch?
Mitglieder in diesem Forum: 0 Mitglieder und 14 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.