Ich versuche momentan HDR zu implementieren. Soweit ich weiß, muss ich dazu Helligkeitswerte zulassen können, die 1 übersteigen.
Hierzu rendere ich das Bild in einen 16bit Float Framebuffer, welches ich danach auf den Bildschirm rendere.
Wenn ich nun z.B. den Diffusewert meiner Lichtquelle > 1 setze, habe ich eine Hell-erleuchtete Szene.
Jetzt habe ich gelesen, dass man nun mit einem Shader ToneMapping anwenden muss, um die Werte aus dem HDR-Farbraum gescheit zurück
in den LDR-Raum zu transformieren. Ich tue das, indem ich den Luminanzwert (Helligkeit) der Farbe ermittle und diese dann mit dieser Formel umrechne:
Y' = Y/(Y+1)
Wenn ich das tue sieht mein Bild danach aber relativ unspektakulär aus. Natürlich wurden die Werte nun nicht einfach geclampt, sondern geschickt umgerechnet,
aber von "Overbright"-Effekten ist nun nichts mehr zu sehen. Den einzigen Vorteil, den ich nun daraus ziehen könnte, wäre, dass ich LDR und HDR Daten im Shader
trennen und auf die HDR Daten einen Blur Filter (Bloom Effekt) loslassen kann. Aber irgendwas kann da noch nicht stimmen.
Wie bekomme ich schönes HDR hin? Lasse ich dazu die Farbraum-Umrechnung weg, sprich es wird einfach geclampt (das scheint die Graka alleine hinzubekommen) und mache einfach noch einen Bloom Effekt drauf? Oder habe ich etwas übersehen?
Registriert: Fr Jan 04, 2008 21:29 Beiträge: 419 Wohnort: Lübeck
HDR ist nicht einfach das überbeleuchten von Flächen (das ist dieses billige "Bloom") , sondern der Effekt der verhindert, dass helle Flächen überbelichten, wenn man ins dunkle schaut und dunkle Flächen extrem dunkel erscheinen, wenn man auf etwas helles guckt. Den Effekt kann man sehr oft beim fotografieren beobachten, wenn man zum Beispiel von drinnen nach draußen fotografiert, und die Helligkeitsunterschiede stark sind. Beispiele dazu sind aus einem beleuchtetem Zimmer aus dem Fenster fotografieren, wenn es nacht ist. Der Ausschnitt mit dem Fenster wird höchstwahrscheinlich tief schwarz sein, obwohl man mit bloßem Auge noch was erkennen könnte. Umgekehrter Effekt ist am Mittag, wenn es in der Bude nicht so Hell ist, weil der Raum zum Beispiel auf der Schattenseite liegt. Da dürfte das Fenster dann extrem grell erscheinen, obwohl das Auge die Landschaft draußen noch bestens wahrnimmt.
Diesen Effekt nach zubilden ist nicht ganz einfach. Dazu braucht man eine hohe Genauigkeit in der Helligkeitserfassung (128bit wird von Fotografen empfohlen), denn man muss die Helligkeit des fokusierten Punktes als "Mittelwert" betrachten an dem sich das Auge angepasst hat und alles was heller ist noch heller machen und alles was dunkler ist noch dunkler machen (nicht übertreiben! In vielen Spielen sieht es oft so aus als würde die Erde verglühen). In der HDR-fotografie versteht man eigentlich den Effekt, dass man durch das Fotografieren mit vielen unterschiedlichen Belichtungszeiten die Luminanz jedes Pixels bestimmen kann und so den "echten" Farbwert errechnen kann, die Szene also so erscheint, als sei sie perfekt gleichmäßig ausgeleuchtet (und nur deshalb braucht man 128bit, weil man extrem Schwachbeleuchtetes genauso erfassen muss wie extrem Hellbeleuchtetes). Diesen Effekt kannst du einfach hinbekommen, in dem du alle Shader einfach ausschaltest und die Standart OpenGl rendering pipeline ohne Licht verwendest.
Also noch einmal kurz, für HDR speichert man die luminanz der Szene seperat und "extremisiert" die Abweichungen von der Luminanz im Fokus. Bloom ist einfach nur ein breitschmieren per gausschem Blur der Helligkeits werte und wenn man ganz eklig ist schmiert man einfach nur das fertig gerenderte Bild breit und man erhält typische mmorpg-grafik.
Den Effekt den du meinst hatte ich noch vor einzubauen, dafür muss aber erst einmal das Fundament gelegt werden. Und da fehlt mir noch ein wenig das Verständnis.
Leider finde ich auch wenig ausführliche Quellen zu dem Thema. Wie ich Bloom implementieren kann ist klar.
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Sellmann. Bist du sicher, dass mit HDRI in der Fotographie das Selbe gemeint ist wie mit HDR in 3D Anwendungen? Die Technik ist sicher sehr stark verwandt nur verfolgen beide meiner Meinung nach sehr unterschiedliche Ziele.
HDRI in der Fotographie: Selbst teure Spiegelreflexkameras haben mit 12 oder 14 Bits pro Kanal einen beschränkten Dynamikumfang. Deswegen werden bei HDRI mehrere Aufnahmen mit verschieder Belichtung durchgeführt. Also in dem zum Beispiel der Raum vernünftig augeläuchtet ist und welche wo der Blick durch das Fenster vernünftig ausgeleuchtet und man Himmel etc erkennen kann. Diese 3+ Fotos werden dann mittels spezieller Software zu einem Bild verrechnet, in dem man sowohl den Raum als auch den Himmel erkennt. Mit anderen Worten wird dort die Dynamik der gesammten Szene extrem zusammengedrückt. Wo mitunter sehr sureale Effekte entstehen können.
HDR in 3D: Dort wird die hohe Dynamik der Bilder doch eher dazu benutzt um Überstrahlungen bewusst erzeugen zu können. Also krelles Sonnenlicht. Allerdings so, dass es nur krell aussieht aber nicht irgendwann einfach nur ein großer weißer Fleck wird. Was bei abgeschnittenen Werten zwangsweise passiert.
In dem Wikipedia Artikel zu HDRI kann man das wohl glaube ich ganz gut erkennen was ich meine. Erzeugung aus Belichtungsreihen ist ein Beispiel für HDRI in der Fotographie. Dabei sieht man die Einzelbilder und das Resultat. Und bei dem Bild in HDR-Rendering sieht man gut wie die Überstrahlungen bewusst eingesetzt werden ohne, dass die hellen Stelle total überstrahlt werden und die Werte abreißen.
Also ich weiß nicht ob du das so meinst Sellmann. Vielleicht habe ich dich auch nur nicht richtig verstanden.
In dem Artikel klingt es so, als würde ich Tonemapping benötigen. Vielleicht verwende ich nicht die richtige Formel, die Anpassung des Auges wird ebenfalls noch nicht einberechnet (ich denke exposure ist hier der entscheidende Begriff).
Um nochmal sicherzustellen, dass jeder weiß, was ich effekttechnisch erreichen möchte:
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Mich würde interessieren, welche der beiden Varianten du gerne erreichen willst. Die untere finde ich deutlich hübscher und viel mehr HDRI-Alike als die obere, die eher nach überstrahlter Digitalfotografie aussieht.
greetings
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Der Effekt den ich erreichen möchte ist der obere. Diese starke Überstrahlung ist auch eher ein temporärer Effekt, der innerhalb einer Sekunde fast vollständig wieder verschwindet. Gleichermaßen wird dort der Effekt simuliert, dass wenn man von einer hellen Region in eine dunkle eintritt, man vorerst nichts sieht, weil sich das "Auge" noch nicht an die Dunkelheit gewöhnt hat. Mein Ziel der Nutzung dieses Effektes ist mehr der künstlerische als der realistische Aspekt.
Registriert: Mi Mär 09, 2005 15:54 Beiträge: 372 Wohnort: München
Programmiersprache: Delphi, C#, FPC
Hab den Thread gerade durch Zufall gesehen, daher erst die späte Antwort.
Also HDR heißt nicht automatisch, dass man diese Überblendungen bekommt. Man kann mit den HDR-Farben nur viel mehr anfangen . Dein Operator (Y' = Y / (Y + 1)) ist nur einer von vielen Tone-Mapping-Operatoren. Ich hab hier mal ein Beispiel gefunden, bei dem 3 verschieden Tone-Mapping-Operatoren eingebaut sind. Am besten für den Effekt ist (würd ich sagen) der S-Curve-Operator. Bei der Demo sollte man vorallem auf den Himmel achten während man den exposure-Wert ändern.
Der Blooming-Effekt wirkt zwar auch ganz gut (und kommt deinem Wunschbild sehr nahe), jedoch find ich das Blooming immer etwas übertrieben. Aber das ist nur meine persönliche Meinung.
Um dann das "Auge" zu simulieren, musst du dann die Helligkeit der Szene herausfinden und diese in einer Variable speichern. In einer zweiten Variable speicherst du die aktuelle Helligkeit, an die sich das virtuelle Auge gewöhnt hat. Diesen zweiten Wert passt du dann Frame per Frame an die Helligkeit der ersten Variable an. Je schneller du das machst, desto schneller gewöhnt sich das Auge an die Helligkeit.
Die Helligkeit des Auges ist dann der exposure-Wert, den du dann noch beliebig skalieren oder weiterverarbeiten kannst.
Szene in kleine Textur rendern und die Helligkeit ermitteln (soll das schon in HDR geschehen? kann ich das im shader machen?)
Die Szene als Vollbild in ein FBO rendern (Float Genauigkeit, sprich HDR)
Das FBO mittels HDR-Shader (Tone-Mapping) und "Augenhelligkeit" auf den Schirm rendern.
Die HDR Werte (>1.0f) aus diesem Bild in eine andere Textur extrahieren (im Shader, nur wie genau weiß ich auch noch nicht)
Diese Textur auf eine niedrige Auflösung downsamplen (wie mache ich das am besten?)
horizontal und vertikal blurren und additiv (Vollbild) über das Bild blenden
"Augenhelligkeit" an die Szenenhelligkeit über die Zeit anpassen.
Ich habe in Shadern so Sachen gelesen wie das hier:
Code:
// We write the LDR and HDR portions of the image to separate images.
// LDR is the [0, 1] part:
gl_FragData[0] = min(color, 1.0);
// HDR is everything that's > 1:
gl_FragData[1] = max(color - 1.0, 0.0);
Wie funktioniert das genau? Hier wird das Bild ja scheinbar in HDR und LDR aufgeteilt, damit der HDR Teil geblurrt werden kann.
Tone-Mapping wird dort scheinbar überhaupt nicht verwendet (bzw ist der "min" operator hier scheinbar schon das "Tone-Mapping").
Also vom Grund-Prinzip her ist doch HDRR nichts anderes als, als das ich pro Farbkanal mehr Bits zum Rendern nutze. Standardmäßig haben wir 8 Bit/Kanal. Beim HDR nehme ich nun ein Floatingpint-Format und habe so einen größeren Bereich pro Farbkanal. Dementsprechend musst du also deine Szene von Anfang an in so eine passende Textur rendern. Das wäre der erste Schritt. Im Zweiten musst du nun deine Farben aus dem großen Bereich wieder auf die 8 schrumpfen, weil der TFT nunmal nicht mehr kann. und je nachden wie du das anstellst, bekommst du halt diese Effekte, von am anfang hell bis nach ein paar Sekunden wirds dunkler.
So muss jetzt essn, schreib evtl später noch was dazu^^
MfG Pellaeon
_________________ __________
"C++ is the best language for garbage collection principally because it creates less garbage." Bjarne Stroustrup
Mitglieder in diesem Forum: 0 Mitglieder und 6 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.