Anamorphic Lens Flare



  • Hallo,

    ich implementiere momentan einen post processing shader, der einen anamorphen lens flare effekt der Szene hinzufügt. Dafür render ich momentan alle ausgedehnten Lichtenquellen als weiße Objekte in einen Framebuffer und übergebe diese Textur dann an meinen Shader.
    Im Shader steht dann folgendes:

    // horizontaler Blur
    if (horizontal)
    {
        float alpha = min(horizontalBlur() * brightness, 1.0);
        fragColor.rgb = mix(flareColor, lightColor, alpha);
        fragColor.a = alpha;
    }
    // vertikaler Blur
    else
    {
         fragColor = verticalBlur();
    }
    

    Das schwarz-weiße Bild aus dem Framebuffer wird stark horizontal blured. Der daraus entstehende Grauwert wird als alpha benutzt und aus diesem alpha wird nach meinem belieben irgendeine Farbe errechnet. Da der alpha-Wert bei einem starken blur relativ niedrig wird, multipliziere ich ihn mit einem Helligkeitsfaktor.
    Im zweiten Durchlauf wird das im ersten Durchlauf gezeichnete RGBA-Bild dann einfach nur standardmäßig um wenige Pixel vertikal blured.
    Das ganze sieht schon ganz cool aus, gäbe es da nicht das Problem mit der Helligkeit. Ist die Lichtquelle vom Beobachter weit entfernt, habe ich nur einen kleinen Punkt auf meiner schwarz-weiß Textur. Wird dieser blured ist das Resultat natürlich sehr "dunkel". Je näher die Lichtquelle dem Beobachter kommt (also je größer der Punkt auf der Textur wird), desto heller wird auch mein blur. Das führt dazu, dass nur in einem bestimmten Abstand der blur so aussieht, wie er aussehen soll. Ist die Lichquelle zu nah, ist er zu hell, ist sie zu fern, ist er zu dunkel.
    Hier mal zwei Screenshots die das Problem verdeutlichen sollen:
    Zu dunkel: http://i.imgur.com/u86pTBD.png
    Zu hell: http://i.imgur.com/xzqRgCH.png

    Meine Frage ist nun, wie mache ich die Helligkeit des blurs unabhängig von der Entfernung der Lichtquelle? Die Tiefentextur aus dem Framebuffer steht mir zwar zur Verfügung, jedoch kam ich bisher noch auf keine Idee, wie ich diese gescheit nutzen kann 😕



  • J. J. Abrams schrieb:

    Meine Frage ist nun, wie mache ich die Helligkeit des blurs unabhängig von der Entfernung der Lichtquelle?

    Indem du dafür sorgst, dass, unabhängig von der Pixelanzahl, immer dieselbe akkumulierte Helligkeit entsteht.
    1 Pixel:
    Farbe = LightFarbe/1

    10 Pixel:
    Farbe = LightFarbe/10

    100 Pixel:
    Farbe = LightFarbe/100

    Wieso machst du dir soviel Arbeit wenn du keine realistischen Resultate willst? Einfach ein Sprite rendern, sodass es immer gleich hell ist.
    https://answers.unrealengine.com/storage/temp/28935-collision module not work 1.jpg

    Die Tiefentextur aus dem Framebuffer steht mir zwar zur Verfügung, jedoch kam ich bisher noch auf keine Idee, wie ich diese gescheit nutzen kann 😕

    Vielleicht mal verpachten, wenn du selbst keine Nutzungsidee hast, aber dennoch Rendite erwartest.



  • WunschFee schrieb:

    Wieso machst du dir soviel Arbeit wenn du keine realistischen Resultate willst? Einfach ein Sprite rendern, sodass es immer gleich hell ist.
    https://answers.unrealengine.com/storage/temp/28935-collision module not work 1.jpg

    Die Textur mit all den weißen Punkten und Vierecken und Ellipsen und was weiß ich wird mir vorgegeben und ich muss diese weiterverarbeiten.

    WunschFee schrieb:

    Indem du dafür sorgst, dass, unabhängig von der Pixelanzahl, immer dieselbe akkumulierte Helligkeit entsteht.
    1 Pixel:
    Farbe = LightFarbe/1

    10 Pixel:
    Farbe = LightFarbe/10

    100 Pixel:
    Farbe = LightFarbe/100

    Wie genau soll das funktionieren?
    Nehmen wir zum Beispiel einmal an, es sind zwei Lichtquellen zu sehen. Dann wird das ganze schon nicht mehr funktionieren.



  • Nutzt du HDR/Floating Point Texturen für das Schwarz-Weiß-Bild?
    Wenn du das ganze dann mit additivem Blending renderst, sollte das ganze relativ gut funktionieren (da weiß+weiß = "mehr" weiß)

    Ansonsten sehen deine Screenshots aus, als würde da noch Color Correction fehlen 😉


Anmelden zum Antworten