Glow-Effekt mit unterschiedlicher Stärke innerhalb/ausserhalb Objekt
-
Hallo zusammen,
Ich implementiere einen Glow-Effekt in einer 2D-Szene folgendermassen:
- Glühendes Objekt in FBO zeichnen
- Weichzeichnungsfilter anwenden (2 Shaderdurchgänge, horizontal und vertikal)
- Resultat über Szene mit additivem Blending rendern
Ausserhalb des Objekts sieht das Glühen gut aus, aber das Objekt selbst wird viel zu hell (sodass man kaum noch die Textur sieht). Was ich bisher versucht habe:
- Screen- statt additivem Blending: Verbessert die Situation zwar, aber leider ist das Glühen ausserhalb dann nicht mehr so prägnant.
- Im Shader Originalobjekt vom Resultat (skaliert) subtrahieren, sodass der Effekt innerhalb des Objekts abgeschwächt ist. Führt allerdings zu sprunghaften Übergängen des Glühens an der Objektkante, was auch nicht schön aussieht.
Ich könnte mir noch vorstellen, zwei Blurs mit unterschiedlichen Radien anzuwenden, und dann den mit kleinerem Radius von dem mit grösserem zu subtrahieren. So hätte man einen fliessenden Übergang, braucht allerdings etwas viele Shader-Durchgänge.
Gibts hier eine Best Practice? Wie würdet ihr das Problem angehen?
-
mach das orginal objekt dunkler
-
Gamma-korrigiertes additives Blending machen.
-
Du könntest zusätzlich eine invertierte Version von schrit 1. erstellen und darauf den Weichzeichner anwenden. Anschließend dieses mit denn anderen Berrechnungen in Schritt 3. kombinieren.
-
Danke für die Antworten!
rapso schrieb:
mach das orginal objekt dunkler
Damit vermeide ich zwar die zu helle Textur, aber der Schein ausserhalb des Objekts ist auch schwächer.
hustbaer schrieb:
Gamma-korrigiertes additives Blending machen.
Schau ich mir mal an, allerdings müsste ich dann Blending auch im Shader handhaben, d.h. ich muss die Szene selbst zuerst in einen FBO rendern. Aber spätestens bei anderen Post-Effects wird das eh nötig.
Osbios schrieb:
Du könntest zusätzlich eine invertierte Version von schrit 1. erstellen und darauf den Weichzeichner anwenden. Anschließend dieses mit denn anderen Berrechnungen in Schritt 3. kombinieren.
Du meinst quasi die dunklen Stellen glühen lassen? Aber dann seh ich nicht ganz, wie dadurch ein stärkeres Glühen ausserhalb möglich wird... Hast du zufällig einen Artikel o.Ä. dazu?
Spricht etwas gegen meine Idee mit 2 Blurs unterschiedlicher Radien? So wie ich das sehe, brauchen eure Vorschläge etwa gleich viele Shaderdurchgänge und sind auch nicht viel günstiger zu berechnen...
-
Nexus schrieb:
rapso schrieb:
mach das orginal objekt dunkler
Damit vermeide ich zwar die zu helle Textur, aber der Schein ausserhalb des Objekts ist auch schwächer.
das ist oft von vorteil und man realisiert es nur schwer. du musst nunmal dunkle stellen haben um die hellen auch zu sehen, den glow sieht man, auch wenn der schwaecher ist.
falls es dir nicht ausreichend ist, kannst du immer noch eine andere textur fuer glow benutzen als fuer die basis.hustbaer schrieb:
Gamma-korrigiertes additives Blending machen.
Schau ich mir mal an, allerdings müsste ich dann Blending auch im Shader handhaben, d.h. ich muss die Szene selbst zuerst in einen FBO rendern. Aber spätestens bei anderen Post-Effects wird das eh nötig.
in dem zusammenhang muestest du das alles eigentlich im linearen buffer machen z.b. mit 16bit float und am ende einmal tonemapping. je mehr effekte du haben wirst, die sich gegenseitig beeinflussen, desto schwerer wird es sie zu vereinen. linearer flot buffer + tonemapping sind deswegen gaengig bei modernen spielen.
-
Nexus schrieb:
Spricht etwas gegen meine Idee mit 2 Blurs unterschiedlicher Radien? So wie ich das sehe, brauchen eure Vorschläge etwa gleich viele Shaderdurchgänge und sind auch nicht viel günstiger zu berechnen...
Wenn ich ein Problem habe, das ich entweder dadurch lösen kann irgendeinen "Shortcut" zu entfernen (wie eben den "Shortcut" additives Blending auf nicht-linearen Werten zu machen), oder den "Shortcut" drinnen zu lassen und statt dessen einen Workaround zu basteln, dann ziehe ich es grundsätzlich vor den "Shortcut" zu entfernen.
Weil man damit erfahrungsgemäss besser fährt. Workarounds für "Nebeneffekte" von Abkürzungen die man der Einfachkeit halber gemacht hat haben nämlich die Tendenz problematisch zu sein. D.h. es wäre leicht möglich dass es dann bei 90% der Szenen gut aussieht, aber bei 10% halt nicht. Dann müsstest du einen "2nd level" Workaround bauen. Mit dem du dann auch wieder nicht auf 100% kommst. Usw.
Wobei ich natürlich nicht garantieren kann dass lineares additives Blending hilft.
Wenn die Objekte eher heller als der Hintergrund sind, dann sollte es mMn. helfen, da bei korrektem linearem additiven Blending dunkle Bereiche stärker aufgehellt werden und helle Bereiche weniger stark als bei additivem Blending auf Gamma > 1.0 Werten.
-
Nexus schrieb:
- Glühendes Objekt in FBO zeichnen
- Weichzeichnungsfilter anwenden (2 Shaderdurchgänge, horizontal und vertikal)
- Resultat über Szene mit additivem Blending rendern
Wenn Du nur die gluehenden Objekte in einem separaten Framebuffer hast, hat der ja auch einen Alpha-Kanal.
Sofern Du darin nicht schon irgendwelche anderen Informationen ablegst, kannst Du daraus entnehmen, ob Du Dich auf oder neben einem Objekt befindest (die leeren Bereiche haetten dann alle einen Alphawert von 0, die gefuellten von zB 255).
Diese Information koenntest Du benutzen um den Glow auf einem Objekt dunkler zu machen und ausserhalb heller zu lassen.Ausserdem koennte man im Render-Pass fuer die gluehenden Objekte einen zusaetzlichen Fresnel-Term verwenden der die Raender der Objekte hervorhebt - so grenzen sich ueberlagernde Objekte trotz Weichzeichner noch gegeneinander ab.
Nexus schrieb:
Ausserhalb des Objekts sieht das Glühen gut aus, aber das Objekt selbst wird viel zu hell
In so einem Fall wuerde ich einfach mal Jemanden mit den Parametern spielen lassen der ein gewisses Gefuehl fuer Aesthetik hat.
Das bringt oft viel mehr als noch mehr Technologie reinzustecken...
-
Vielen Dank für die weiteren Ideen. Einiges davon kenne ich noch nicht, werde mich mal entsprechend einlesen