alle objekte in einer scene transparent rendern



  • Wenn ich in einer scene mehrere transparente objekte zeichnen möchte, habe ich das problem, dass jeweils nicht alle anderen transparenten objekte von allen anderen transparenten reflektiert werden können.

    ich benutze die blending funktion zum rendern, und habe mal probiert einfach iterativ nochmal alle tranparenten ohne tiefentest zu rendern, damit man auch tatsächlich alles gut durchscheinen sieht. leider gibt es dann probleme mit der tiefendarstellung bei den n9icht transparenten objekten. mich würde daher mal interessieren, ob nicht eine bessere möglichkeit für sowas gibt.



  • Wenn das klassische Back-To-Front Ordering nicht klappt oder geht.

    Stichwort: Orderindependet Z
    Link: "http://developer.nvidia.com/attach/6545"



  • hmm interessant, aber ich hätt nicht gedach, dass so eine sache gleich dermaßen ausartet. das depth peeling ist außerdem sicher recht langsam. aber wenns geht, dann werde ich das später mal ausprobieren. ich habe erst neulich mal angefangen überhaupt support für shaderdateien einzubauen, und frage mich ob die überhaupt funktionieren werden.



  • das depth peeling ist außerdem sicher recht langsam

    Der Artikel ist schon nen paar Jährchien alt (so aus Geforce3 zeiten), aber Alphablending ist allgemein eine sehr langsamme Angelegenheit (Fillratebedingt und zusätzliche Speicherzugriffe für die Blendingoperation).

    Ich weiß ja nicht, was du genau für Objekte renderst und ob du es überhaupt schon mit Back-To-Front Ordering probiert hast (also einen Algorithmus in deiner Engine implentiert hast, der die Objekte von Hinten nach Vorne sortiert).

    Falls es sich um semitransparente Objekte wie Blätter von Bäumen etc. handelt kannst du es auch mal mit Alpha To Coverage versuchen. Ich hab es nie probiert, aber theoretisch funktioniert AtoC auch mit der Fixed Function Pipeline.



  • hm, so einen sortieralgorythmus könnte man schon implementieren, aber das problem, dass ich habe, kann man wohl nicht damit beheben.

    wenn ich meinetwegen 3 quads übereinander rendere. dann kann man durch den zuletzt gerenderteten jeweils beide vorigen erkennen, aber durch die vorigen nicht die jeweils später gerenderten.

    ich habe es aber im moment schon so gemacht, dass ich alle undurchsichtigen gegenstände vor den transparenten rendere und zumindest diese schon für alle transparenten sichtbar sein sollten.

    was gibt es denn noch für alternativen. der bisherige die tranparenten jeweils mehrfach zu rendern ist nicht so dolle...



  • was gibt es denn noch für alternativen. der bisherige die tranparenten jeweils mehrfach zu rendern ist nicht so dolle...

    Was soll ich dazu noch sagen?

    http://igooglethatforyou.com/?q=directx+alphablending ich fine die Seite toll. 😃
    Erster Eintrag: http://keepcoding.bplaced.net/kcdev/tutorials/DXTutAlphaBlending.pdf ..und dann noch lesen.

    Des weiteren hat dieses Board eine FAQ... auch mit einem Thread über Sachen, die ein DX Progger, oder allgemein Graphikprogger wissen sollte. 😉



  • das problem, dass ich habe, kann man wohl nicht damit beheben. wenn ich meinetwegen 3 quads übereinander rendere. dann kann man durch den zuletzt gerenderteten jeweils beide vorigen erkennen, aber durch die vorigen nicht die jeweils später gerenderten.

    So funktioniert nunmal Alpha-Blending; jeder Pixel wird mit dem Hintergrund gemischt - das setzt natuerlich voraus, dass der Hintergrund bereits da ist.
    Eine allgemeingueltige Loesung muss also die Polygone sortieren (und damit verbundene Limitierungen in Kauf nehmen) was aber nicht praxistauglich ist.

    Workarounds:
    1. Nur additives Blending benutzen
    2. Alle Meshes in konvexe Teilobjekte zerlegen, sortieren und jeweils erst die backfacing und dann frontfacing Polys rendern.


  • Mod

    gentoo schrieb:

    wenn ich meinetwegen 3 quads übereinander rendere. dann kann man durch den zuletzt gerenderteten jeweils beide vorigen erkennen, aber durch die vorigen nicht die jeweils später gerenderten.

    deswegen musst du es sortieren.

    bei objekten kannst du jedes frame sortieren.
    fuer innerhalb der objekte benutzt man six-side-indexbuffer, man sortiert vor fuer +x -x +y -y +z -z und je nach orientierung des objektes zur camera waehlt man dann den jeweiligen.

    perfekt sind beide dinge nicht, aber wenn die allermeisten spiele damit leben koennen..

    😉


Anmelden zum Antworten