• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

Tiefenunschärfe

m1au

New member
Hi

Eine Theoriefrage diesesmal.

https://en.m.wikibooks.org/wiki/OpenGL_Programming/Depth_of_Field

Wenn ich das richtig verstehe, wird hier bei allen Kamerapositionen immer die gleiche Projektionsmatrix verwendet.

Ist meine Vermutung richtig, dass dann aufgrund dessen auch all jene Objekte unscharf werden, die sich auf gleicher Tiefe wie jenes Objekt befinden, auf das scharf gestellt wird?

Falls meine Vermutung stimmt, wie kann man dieses Problem lösen? Benötigt man dann für jede neue Kameraposition eine neue Projektionsmatrix? Muss die Projektionsfläche dann immer etwas schräg sein?
 
Ist meine Vermutung richtig, dass dann aufgrund dessen auch all jene Objekte unscharf werden, die sich auf gleicher Tiefe wie jenes Objekt befinden, auf das scharf gestellt wird?
Wenn das so ist, dann ist die Tiefenunschärfe falsch implementiert. Es sind immer alle Objekte scharf, die den gleichen Abstand zum Objektiv haben wie das scharf gestellte Objekt.

... OK - hab' mir das doch mal durchgelesen und das, was die da beschrieben hat im Endeffekt wenig mit Tiefenschärfe zu tun. Das ist im Grunde Bewegungsunschärfe, wenn du die Kamera ein bisschen im Keis bewegst, aber immer das Zielobjekt anvisierst. Die Flächen sind da immer etwas schräg, da man sonst sofort erkennt, dass das Ergebniss ein ganz ein anderes ist.
Und dass nur einmal im Kreis gefahren wird und der Kreis nicht komplett ausgefüllt wird, macht das Ergebniss auch nicht besser.

Wie man das Problem löst, kann ich dir nicht sagen, da ich mich mit OpenGL zu wenig auskenne. Ev. kann man das auch gar nicht sauber lösen... die Beschreibung von unscharfen Objekten ist physikalisch nicht besonders einfach.
 
m1au schrieb:
Ist meine Vermutung richtig, dass dann aufgrund dessen auch all jene Objekte unscharf werden, die sich auf gleicher Tiefe wie jenes Objekt befinden, auf das scharf gestellt wird?
Ausgehend von einer Digicam, da ist die Blende verantwortlich für die Tiefenschärfe.
Bewegst du nun die Kamera und möchtest alles scharf haben machst du die blende weiter zu.
Mochtest Du ein Objekt immer scharf haben brauchst du ein guten Autofokus der das Objekt immer scharf stellt. Sowas wird über eine Phasenverschiebung errechnet.

Eine Graka kennt kein Blende. Du kannst aber den Computer eine Brille aufsetzen das nennt sich
Dekonvolution

@kkapsner,
Das mit der Kamera im Kreis bewegen verstehe ich iriw nicht. Laut den Bildern wir da keine Kamera bewegt sonder statisch fokussiert.
 
Zuletzt bearbeitet:
Ausgehend von einer Digicam
Das ist nicht nur bei einer Digitalkamera der Fall, sondern bei allen optischen Instrumenten.

Du kannst aber den Computer eine Brille aufsetzen das nennt sich Dekonvolution
Über eine Faltung bzw. Dekonvolution wird aber immer das komplette Bild gleich behandelt und keinerlei Abstandsinformation verarbeitet.

Das mit der Kamera im Kreis bewegen verstehe ich iriw nicht.
Das ist die Technik, mit der in dem Link die Tiefenschärfe simuliert wird. Schau' dir die Unschärfekegel mal genau an. Das sind nicht ausgefüllte Kreise und die kommen von der Bewegung.
 
Also ich habe das jetzt auf die Reihe bekommen. Der Artikel https://en.m.wikibooks.org/wiki/OpenGL_Programming/Depth_of_Field stimmt eigentlich nicht wirklich.

Der Trick ist nämlich, die Projektionsfläche konstant zu halten, während man die Kamera bewegt. Hier spricht man von "jittern".

Außerdem musste ich leider feststellen, dass es in WebGL den im Artikel erwähnten "accumulation buffer" nicht gibt. Naja, shit happens. Man kann sich aber damit behelfen, dass man mit framebuffers arbeitet und ein eigenes shader-Programm schreibt, das immer 2 Texturen von 2 framebuffer zusammenführt.

Alles mega kompliziert. Aber es funktioniert.

Falls es wen interessiert: http://pastebin.com/BYTRjGye

Ist zwar unschön programmiert, aber ich glaube, man findet sich trotzdem ganz gut zurecht darin. Habe darin die 2 shader-programme zu einem einzigen zusammengeführt. Heute versuche ich mal, 2 unterschiedliche Programme zu kompilieren.

Das ganze schaut dann folgendermaßen aus:
Unbenannt.png

EDIT: Programm in einer schöneren Variante nachgereicht. Interessant wirds eigentlich erst ab Zeile 1399.
 
Zuletzt bearbeitet:
Ich weiß nicht genau, wie ich es formulieren könnte. Aber ich würde schon sagen, dass man die Kamera bewegt. Die Position der Kamera verändert man zwar nicht, aber man jittert. D. h. man nimmt eine Szene letztendlich dann doch von einer anderen Kameraposition aus auf.

Das muss man in 2facher weise bei den Transformationen berücksichtigen.

Die projection-Transformations-Matrix hat dann etwas andere Werte (Zeilen 1454 bis 1475), und außerdem muss man zusätzlich die ganze Szene noch etwas verschieben (habe ich gleich direkt in der view-Transformations-Matrix mittels jitterX und jitterY in den Zeilen 1498 und 1499 berücksichtigt).

Für WebGL muss man auch was über haben... ich habe es nicht.
Du musst dich nur mal durch die ganze 3D-Theorie durchbeißen, dann macht das (schon fast) Spaß :)
 
Zuletzt bearbeitet:
m1au schrieb:
Die Position der Kamera verändert man zwar nicht, aber man jittert.
Also jittern ist bei mir in Sachen der Akustischen Signalverarbeitung etwas anderes, nämlich das was man bei streamen von Daten nicht haben möchte, der Ton hängt .



m1au schrieb:
Du musst dich nur mal durch die ganze 3D-Theorie durchbeißen, dann macht das (schon fast) Spaß
Nee lass mal mir reicht der Akustische Bereich der Signalverarbeitung z.Z hänge ich an einer agc
Werde aber gebremst da Login System in Nodejs noch aussteht. :disgust:

Möchte später mal ein 3D Spectrum Analyser in WEBGL aufsetzen aber ohne zu sehr in die Theorie einsteigen zu müssen.
Das werde ich mit Threejs machen.
Demo Bild:
wfall08.JPG



Schau mal was ich gefunden habe.
three.js webgl - postprocessing - depth-of-field
oder
three.js webgl - postprocessing - depth-of-field

VG,
xorg1990
 
Die 2 DOF-Beispiele schauen echt toll aus. Aber ich glaube, die funktionieren nach einem anderen Prinzip. Ich glaube, in meinem Buch auch noch von einer anderen Variante gelesen zu haben.

3D-Spectrum-Analyser hört sich nach Fourier-Analyse an. Ist das richtig? Ich versuche nämlich aktuell, mir die mathematischen Grundlagen dazu beizubringen.
 
m1au schrieb:
Die 2 DOF-Beispiele schauen echt toll aus. Aber ich glaube, die funktionieren nach einem anderen Prinzip.
Ist ja bei Treejs egal wie es umgesetzt ist, Hauptsache ist es funktioniert. Es seiden du möchtest das "zu Fuß" programmieren.


m1au schrieb:
3D-Spectrum-Analyser hört sich nach Fourier-Analyse an. Ist das richtig?
Ja der Herr Fourier ist da zu 100% Beteiligt.

m1au schrieb:
Ich versuche nämlich aktuell, mir die mathematischen Grundlagen dazu beizubringen.
Okay, wär mir persönlich zu viel, Akustik und Bildbearbeitung reicht völlig aus. Bin mehr oder weniger Unfreiwillig in die DSP Schiene reingerutscht durch den Amateurfunk. Ursprünglich sollte/wollte ich PCM Samples durch netz schicken, die dann am Browser wider gegeben werden können . Irwie bin ich da jetzt so weit das ich gleich einen QRSS Viewer im Browser Programmiere.

aber nagut du willst Grundlagen:
https://www.youtube.com/watch?v=CYHXWZafse8
https://www.youtube.com/watch?v=ls5MfqLZVbo
https://www.youtube.com/watch?v=wd6hAPS4ILc
https://www.youtube.com/watch?v=7bi5_KC08Kg

https://www.youtube.com/watch?v=g4eQ_2d8pg8
https://www.youtube.com/watch?v=ysBA4husFFs
https://www.youtube.com/watch?v=5Icwv-rk_pU

https://www.youtube.com/watch?v=JMXpBmHKRbs
https://www.youtube.com/watch?v=3BgzO98pKQU
https://www.youtube.com/watch?v=rSHkg-8ZhDA

https://www.youtube.com/watch?v=4hl9JDOP2B4
https://www.youtube.com/watch?v=Z40RvEp0Zs0
https://www.youtube.com/watch?v=tjmo2btQKkU

https://www.youtube.com/watch?v=krAnK4EDXSs
https://www.youtube.com/watch?v=KnFNv6eeSOM
https://www.youtube.com/watch?v=-NYdJeN9VFc
https://www.youtube.com/watch?v=QEYKkQ3JVrA
https://www.youtube.com/watch?v=8acvTBXEeoM
https://www.youtube.com/watch?v=V9l_SAdUHEA

Wichtig für dich ist die DFT(Diskrete Fourier-Transformation) bzw. FFT(fast Fourier transform)
Aber auch dafür gibt es schon genügend Javascript Libs.

Die ersten 4 Videos sind Wichtig und Interessant.
 
Zurück
Oben