Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: So Jul 13, 2025 16:55

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 17 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: Frage zu HDR
BeitragVerfasst: Di Jul 07, 2009 15:11 
Offline
DGL Member

Registriert: Di Mai 24, 2005 16:43
Beiträge: 710
Hallo,

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?

mfg


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jul 07, 2009 18:45 
Offline
DGL Member
Benutzeravatar

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.

_________________
Klar Soweit?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jul 07, 2009 21:28 
Offline
DGL Member

Registriert: Di Mai 24, 2005 16:43
Beiträge: 710
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.

mfg


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jul 08, 2009 08:50 
Offline
DGL Member
Benutzeravatar

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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jul 08, 2009 11:08 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Aug 18, 2007 18:47
Beiträge: 694
Wohnort: Köln
Programmiersprache: Java
Über obige Wikipedia-Links bin ich über diesen etwas älteren Artikel gestolpert. Teilwiese sehr ausufernd. :)

Nicht unbedingt ein Tutorial mit Anleitung von A-Z, eher ein paar sehr interessante Hintergrundinfos und zu beachtende Aspekte.

_________________
Es werde Licht.
glEnable(GL_LIGHTING);
Und es ward Licht.


Zitat aus einem Java Buch: "C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do it blows your whole leg off"

on error goto next


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jul 08, 2009 12:20 
Offline
DGL Member

Registriert: Di Mai 24, 2005 16:43
Beiträge: 710
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:

http://files.myopera.com/Deathfragger/a ... 8/hdr2.jpg

Ich habe keine HDR Texturen etc. ich möchte die "Überstrahlung" lediglich durch das Licht induziert implementieren.

Vielen Dank


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jul 08, 2009 12:31 
Offline
DGL Member
Benutzeravatar

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 networkmy 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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jul 08, 2009 12:45 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Ich glaube beide. Er möchte beim "ins Freihe treten", dass die Szene so überblendet wird und sich danach langsam "erholt".

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jul 08, 2009 12:46 
Offline
DGL Member

Registriert: Di Mai 24, 2005 16:43
Beiträge: 710
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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jul 09, 2009 14:28 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Aug 18, 2007 18:47
Beiträge: 694
Wohnort: Köln
Programmiersprache: Java
Ich glaube dazu kann uns littleDave bestimmt was sagen. IMHO hat er das in seiner Gael Engine verbaut.

_________________
Es werde Licht.
glEnable(GL_LIGHTING);
Und es ward Licht.


Zitat aus einem Java Buch: "C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do it blows your whole leg off"

on error goto next


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jul 09, 2009 16:48 
Offline
DGL Member
Benutzeravatar

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.

Folgende PDFs dürfen dich vielleicht noch interessieren: High Dynamic Range Rendering in OpenGL, High Dynamic Range Rendering in Real-Time

_________________
Aktuelles Projekt: Gael - Development Blog
Website: LightBlackSoft.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jul 09, 2009 21:20 
Offline
DGL Member

Registriert: Di Mai 24, 2005 16:43
Beiträge: 710
Danke erstmal, das hilft mir sehr weiter :wink:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jul 11, 2009 09:05 
Offline
DGL Member

Registriert: Di Mai 24, 2005 16:43
Beiträge: 710
Mein "Plan" sieht nun wie folgt aus:
  • 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:
  1.   // We write the LDR and HDR portions of the image to separate images.
  2.   // LDR is the [0, 1] part:
  3.   gl_FragData[0] = min(color, 1.0);
  4.   // HDR is everything that's > 1:
  5.   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").

mfg


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jul 11, 2009 10:57 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Apr 25, 2005 17:51
Beiträge: 464
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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jul 11, 2009 11:58 
Offline
DGL Member

Registriert: Di Mai 24, 2005 16:43
Beiträge: 710
Das Grundprinzip ist klar. Nur Teile der konkreten Umsetzung noch nicht.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 17 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

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.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.017s | 17 Queries | GZIP : On ]