Alpha Blending per Pixel Shader?



  • otze schrieb:

    es ist nicht möglich, einen pixel mit einem objekt zu assoziieren.

    Das ist auch nicht nötig. Du schaltest den Shader einfach nur dann ein, wenn das Objekt gezeichnet wird. Dann gehört jeder Pixel zum Objekt. Aber für einen konstanten Alphawert aller Pixel braucht man gar keinen Shader. Wobei die Frage nicht unbedingt klar ausdrückt, was genau passieren soll.

    Bye, TGGC (Dem beste BdT)



  • Alpha Blending muss man nach wie vor mit den RenderStates machen (ka wie sich das in OGL nennt).

    Eine einfache Möglichkeit, um ein komplettes Objekt transparent zu machen wäre zB mit pDev->SetRenderState( D3DRS_BLENDOPALPHA, D3DBLENDOP_ADD ), also einfach das transparente Objekt zur bisherigen Szene dazuaddieren.
    Im Shader sollte die Ausgabefarbe vorher mit dem Alphafaktor multipliziert werden, damit es nicht zu hell wird.

    Natürlich kannst du auch richtiges Alphablending machen, indem Du den Alphawert im Shader ausrechnest und ihn neben der Farbe in c0.a speicherst. Weitere berechnungen werden dann aber wie geasgt über die Renderstates festgelegt.



  • War tatsächlich alles so einfach 🙂

    Einfach

    DX9Device_->SetRenderState(D3DRS_ALPHABLENDENABLE, true);			// Alpha 
        DX9Device_->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
        DX9Device_->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
    

    gesetzt und dann im VShader den Alpha Wert gesetzt. Danke für eure Antworten!



  • np 😃



  • Das mit dem Shader versteh ich trotzdem nicht. Was ist dessen Sinn?

    Bye, TGGC (Dem beste BdT)



  • wenn man den speicehr nicht ganz vollklatschen will, und weis, dass alle objekte immer und überall die gleiche farben, dann lässt man die vertexfarbe raus,und benutzt dann den shader, um die Farbe nachträglich einzubauen.
    für ein Objekt, dass überall blau ist, hat es keinen sinn, für jedes poligon die Farbe blau zu speichern 😉



  • otze schrieb:

    wenn man den speicehr nicht ganz vollklatschen will, und weis, dass alle objekte immer und überall die gleiche farben, dann lässt man die vertexfarbe raus,und benutzt dann den shader, um die Farbe nachträglich einzubauen.
    für ein Objekt, dass überall blau ist, hat es keinen sinn, für jedes poligon die Farbe blau zu speichern 😉

    Klar, aber das geht ja auch ohne Shader. Warum unbedingt einen Shader benutzen?

    Bye, TGGC (NP Intelligenz)


  • Mod

    TGGC schrieb:

    otze schrieb:

    ...

    Klar, aber das geht ja auch ohne Shader. Warum unbedingt einen Shader benutzen?

    weil es nur shader für diese arbeit gibt, egal ob der treiber oder man selbst die verknüpfung setzt.
    zudem dürfte ein shadersetzen fixer sein als zig settexturestagestates.

    rapso->greets();



  • Ich hab bis jetzt keine Materialeigenschaften gebraucht, weil alles via Shader
    und Texturen ging und ich werde wohl auch weiterhin keine brauchen. Hatte keine
    Lust alle umzukrempeln nur um Transparenz hinzuzufügen.



  • rapso schrieb:

    TGGC schrieb:

    otze schrieb:

    ...

    Klar, aber das geht ja auch ohne Shader. Warum unbedingt einen Shader benutzen?

    weil es nur shader für diese arbeit gibt

    Wieso? Es gibt unter DX z.b. den D3DRS_TEXTUREFACTOR, mit dem man sowas wie alles blau oder konstantes Alpha problemlos realisieren kann.

    Bye, TGGC (NP Intelligenz)


  • Mod

    TGGC schrieb:

    rapso schrieb:

    TGGC schrieb:

    otze schrieb:

    ...

    Klar, aber das geht ja auch ohne Shader. Warum unbedingt einen Shader benutzen?

    weil es nur shader für diese arbeit gibt

    Wieso? Es gibt unter DX z.b. den D3DRS_TEXTUREFACTOR, mit dem man sowas wie alles blau oder konstantes Alpha problemlos realisieren kann.[/url])

    weil

    rapso schrieb:

    egal ob der treiber oder man selbst die verknüpfung setzt

    rapso->greets();



  • rapso schrieb:

    egal ob der treiber oder man selbst die verknüpfung setzt

    Was ist mit Kompatibilität zu älteren Karten?

    Bye, TGGC (NP Intelligenz)


  • Mod

    TGGC schrieb:

    rapso schrieb:

    egal ob der treiber oder man selbst die verknüpfung setzt

    Was ist mit Kompatibilität zu älteren Karten?

    Muss man gegen Performance abwägen.

    rapso->greetz();



  • Ein eigener Vertexshader bringt wieviel Performanz im Durchscnitt?

    Bye, TGGC (NP Intelligenz)


  • Mod

    TGGC schrieb:

    Ein eigener Vertexshader bringt wieviel Performanz im Durchscnitt?

    genau (n+1)/n absolute performance, wobei n die anzahl der vertexshader ohne diesen einen ist.

    rapso->greets();



  • Ohne Vormutlich: http://www.digit-life.com/articles2/40vs50/ - "Geometrical performance"

    Bye, TGGC (NP Intelligenz)


  • Mod

    TGGC schrieb:

    Ohne Vormutlich: http://www.digit-life.com/articles2/40vs50/ - "Geometrical performance"

    1. ich sehe keinen benchmark bei dem, wie hier besprochen, ein shaderwechsel in relation zu mehreren stagechanges steht.

    2. ein vertexshader läuft nicht doppelt so schnell, nur weil er auf 1.1 statt 2.0 umgewandelt wurde, es hätte keinen sinn für einen hersteller die version 2.0 mit einem anderen, langsammereren compiler zu versehen.

    rapso->greets();



  • Wie du sagtest, sollte man ja die Performanz vergleichen. Hast du 'nen besseren Vergleich.

    Bye, TGGC (NP Intelligenz)


Anmelden zum Antworten