Alpha-Blending mit Shader



  • die frage waere, was genau du zusammenblenden willst.
    nur weil in der alpha-komponente des framebuffers was drinsteht, heisst das ja nicht, dass blending nicht mehr moeglich waere.



  • Danke für die Antworten! Schade.. 😞



  • Ich rendere nun meine Szene in 2 verschiedene Texturen, Textur1 mit der Tiefen-Information im alpha-Kanal, Textur2 mit den tatsächlichen alpha-Werten.

    Wenn ich nun im Shader auf beide Texturen zugreife, ist das ziemlich arbeitsintensiv. Kann ich die beiden Texturen irgendwie auf ne schnelle Art zusammenmixen?
    Also final.rgba = 1.rgb + 2.a



  • Klar, indem du als zweite Textur gleich den richtigen Buffer nimmst und den Schritt dort rein packst, so sparst du dir einen TexLookUp im Shader und einen extra Pass.

    Und ne Addition im Shader sollte nicht aufwendig sein !



  • Hm, nee, es ist etwas komplizierter:

    In Textur1 werden einige "Zusatz-Infos" gerendert, Tiefe, Hitze-Flimmern, etc.
    In Textur2 wird die Szene gerendert, mit rgba-Informationen. Die Szene MUSS in eine Textur gerendert werden, da sie anschliessend in einem dritten Schritt noch nachbearbeitet wird (Die Textur wird auf ein screen-sized Quad gerendert, auf dem dann Texturkoordinaten, etc. verändert werden).

    Das Problem ist jetzt aber, dass der Shader, der dann diesen dritten Schritt berechnet, ziemlich langsam wird, da er auf 2 Texturen zurückgreifen muss (und das je nach Filter gleich mehrmals pro Fragment). Darum würd ich gern wenigstens eine Zusatz-Info in den alpha-Kanal der Textur2 (der ja im dritten Schritt nicht mehr gebraucht würde) packen. Aber wie geht das am schnellsten?

    Hmm, spätestens jetzt versteht wohl niemand mehr was ich will 😕



  • Warum du sie nachbearbeiten willst frag ich mich. Warum machst du das alles zusammen in einem Pass.

    Und mehrmals auf die Textur zugreifen solltest du auch net müssen, du brauchst doch dafür imho nur den einen Texel in der Textur ...



  • ChaosAngel schrieb:

    Warum du sie nachbearbeiten willst frag ich mich. Warum machst du das alles zusammen in einem Pass.

    Und mehrmals auf die Textur zugreifen solltest du auch net müssen, du brauchst doch dafür imho nur den einen Texel in der Textur ...

    Nachbearbeitung for Depth of Field, Hitze-Flimmern und "Unterwasser-Verzerrungen", das geht nicht im gleichen Pass wie das rendern der Szene.

    Und mehrmals auf die Textur zugreifen muss ich für die Filter. Z.B. Depth of Field: In der "Tiefen-Textur" abfragen, wie sehr das Pixel verwischt wird -> Nachbar-Pixel auf der "Szene-Textur" UND "Tiefen-Textur" abfragen... Tja, das Leben ist fies. Aber die Performance ist doch einigermassen ok, >30fps für ne vernünftig grosse Szene (Dürfte sich aber bei hohen Auflösungen massiv verschlechtern).

    Daher immer noch die Frage ;), ob ich auf der GraKa "günstig" verschiedene Kanäle zweier Texturen zu einer mischen kann...



  • auf der GraKa "günstig" verschiedene Kanäle zweier Texturen zu einer mischen

    einfach reinschreiben:
    texture1 als rendertarget, texture2 als source, nur alpha ersetzen.

    mehrmals auf die Textur zugreifen muss ich für die Filter: Nachbar-Pixel auf der "Szene-Textur" UND "Tiefen-Textur" abfragen...

    dh je staerker "verwischt" werden soll, desto mehr texture-lookups machst du pro pixel?
    wie waer's denn, dein bild einmal in eine dritte textur zu blurren und per "tiefen-alpha" zwischen scharf und unscharf zu blenden?



  • hellihjb schrieb:

    dh je staerker "verwischt" werden soll, desto mehr texture-lookups machst du pro pixel?
    wie waer's denn, dein bild einmal in eine dritte textur zu blurren und per "tiefen-alpha" zwischen scharf und unscharf zu blenden?

    Ne, der Filter hat immer 6 Nachbar-Koordinaten, wo der LookUp passiert, je nach blur wird einfach der radius vergrössert.

    Hm, das mit der 3ten Textur würd mir keinen Vorteil bringen. Ich muss beim "blurren" eben nicht nur die Farbinformationen der Nachbarpixel abfragen, sodern auch deren Tiefe, sonst kann sich ein unscharfes Pixel mit einem scharfen vermischen, wenn dieses neben dem unscharfen liegt, das sollte nicht passieren.

    Das mit dem "nur alpha ersetzen", wie könnte das denn gemacht werden in OpenGL?



  • das einfachste waere, ein "vollbild-quad" mit der entsprechenden textur drueber zu rendern und schreiben fuer rot/gruen/blau zu verbieten:

    glColorMask(bool red, bool green, bool blue, bool alpha);
    


  • hellihjb schrieb:

    das einfachste waere, ein "vollbild-quad" mit der entsprechenden textur drueber zu rendern und schreiben fuer rot/gruen/blau zu verbieten:

    glColorMask(bool red, bool green, bool blue, bool alpha);
    

    Cool, an sowas hab ich gedacht, Danke Dir für den Tip!!

    S'läuft nun mit ca. 50fps für n'vernünftig grosses Bild, allerdings werd ich mal etwas andere Filter-Methoden probieren...
    DOF-Effekt: http://people.ee.ethz.ch/~bachodan/DOF.jpg


Anmelden zum Antworten