helligkeit eines bildpunktes berechnen? [rgb natürlich]
-
Ich wollte einen Bloom Effekt folgendermaßen umsetzen: Im Programm alles alles render, finales "Renderbild" an Pixelshader senden, bei diesem jeden Pixel durchgehen, irgendwie einen skalaren Wert für die Helligkeit des Pixels ausrechnen, und falls dieser über einem bestimmten Wert ist, jeden Pixel um den gecheckten Pixel ausenrum ein wenig aufhellen.
Doch jetzt die eigentliche Frage: Wie berechnet sich aus dem r,g und b Anteil eines Pixels der Helligkeitswert? Und wie muss ich r,g und b Anteil eines Pixels verändern, damit es heller wird, ohne dabei z.b. aus nem Rot ein Pink zu machen?
grüße,
bloomer
-
Also es gibt eine Formel für die Helligkeit
r * 0.30 + g * 0.59 + b * 0.11
diese geht angeblich auf die ITU-R Recommendation 601 zurück. Ist aber nur eine annähernde Beschreibung unseres Helligkeitsempfindens.
-
normalerweise macht man bloom, wenn man keinen HDR puffer hat, mittels selektivem blur + addition aufs originale bild.
d.h. du machst nicht die farbe der pixel heller, sondern addierst einen teil der farbe des "hellen" pixels auf alle nachbarn drauf.
was helligkeit angeht wird vermutlich r+g+b/3 reichen. ansonsten guck mal im netz nach YUV formeln - Y wäre dann die helligkeit.
EDIT: hihi, zu langsam. Das wäre eine der "YUV Formeln" (zumindest der Y Teil davon)
-
hustbaer schrieb:
d.h. du machst nicht die farbe der pixel heller, sondern addierst einen teil der farbe des "hellen" pixels auf alle nachbarn drauf.
was genau ist "einen teil der farbe des hellen pixels" ?
-
Naja (R*k, G*k, B*k), wobei k abhängig von Abstand ist.
Eine Möglichkeit das zu machen wäre
- Du Renderst in eine Textur (Render-Target)
- Du selektierst diese Textur als Input, und zeichnest damit ein Quad auf eine zweite Textur (Temp-Buffer). Dabei verwendest du einen Pixel-Shader, der einfach alles was nicht hell genug ist auf Schwart setzt, und alles was schon hell genug ist unverändert durch lässt.
- Du rechnest einen Weichzeichner (Blur) auf diese Textur. Das ist der schwierige Teil, denn um das halbwegs performant hinzubekommen, muss man tricksen.
- Du selektierst die weichgezeichnete Textur als Input, und zeichnest damit ein Quad auf die Textur mit dem originalen Bild. Dabei verwendest du einen Shader, der einfach die Farb-Werte der Input-Textur und der Ausgabe-Textur zusammenaddiert (einfach R+R', G+G', B+B' - und clampen nicht vergessen).
Fertig.
Wie gesagt, der schwierigste Teil an der ganzen Sache ist der Blur Filter.
Wenn du HDR Rendering verwendest, und die Bereiche die "bloomen" sollen so richtig richtig hell sind, dann kannst du Step 2 durch eine einfache Kopie ersetzen, und bei Step 4 die weichgezeichnete Textur dafür einfach ordentlich abdunkeln. Bzw. einfach einen anderen Blur-Kernel verwenden.