"Schönes" Bild mit Alphatest



  • Hoi,

    ich habe das Problem, dass der Alphatest die Ränder von Objekten schlecht macht. Das Problem ist wahrscheinlich, dass durch den linearen Texturfilter am Rand Werte zwischen 0 und 1 rauskommen und je nachdem wie ich den Grenzwert festlege wird entweder ein im Vordergrund stehendes Objekt am Rand von einem weiter hinter stehendem Objekt überlappt oder ein Objekt weiter hinten wird nicht gerendert und wenn der Alphawert < 1 ist sieht man an der Stelle zum Beispiel zu 80% das vordere Objekt und zu 20% die Clearfarbe und das hintere Objekt nicht. Anscheinend ist es ziemlich scheiße, eine Pixelfarbe zu setzen und dabei den Tiefenwert nicht zu setzen oder umgekehrt.

    Als nächstes hab ich versucht, die Subsets nach Tiefe zu sortieren, aber für sich durchdringende Objekte, wie es bei Bäumen öfters vorkommt, taugt das auch nicht. Auch scheint mir, dass viele Spiele durchaus den Alphatest verwenden, da so Blätter-Planes bei Bäumen sich korrekt durchdringen. Bei diesen Spielen sieht man aber die von mir beschriebenen Effekte nicht, wie machen die das?

    Ich habe mir jetzt überlegt, einen Pixelshader zu schreiben, der folgendes macht: Falls der Alpha-Wert > 50% dann zeichne das Pixel voll transparent und schreibe in den Backbuffer, andernfalls tue nichts.
    Oder ich verwende eine Blendmap als zweite Texture, die ich nicht linear, sondern Punkt-filtere (die Farbe möchte ich weiterhin linear interpolieren).

    Was ist denn für sowas der übliche Weg?



  • Ich verstehe das Problem nicht ganz.
    Warum schreibst du denn nicht in den Z-Buffer rein?
    Solange du nur Alpha-Testing aktiviert hast und kein Alpha-Blending, ist das doch kein Problem.
    So machen es auch die "richtigen" Spiele.

    Optimizer schrieb:

    Ich habe mir jetzt überlegt, einen Pixelshader zu schreiben, der folgendes macht: Falls der Alpha-Wert > 50% dann zeichne das Pixel voll transparent und schreibe in den Backbuffer, andernfalls tue nichts.

    Warum willst du dafür einen Shader schreiben?
    Genau das kannst du doch mit Alpha-Testing erreichen.



  • Das Problem ist: Was mache ich, wenn der Alphawert 20% ist? In den Z-buffer reinschreiben oder nicht? Der Alphawert ist natürlich nicht 20%, weil ich das in meiner Textur so machen würde. Ich weiß, dass man mit Alphatesting keine halbtransparenten Flächen korrekt darstellen kann. Aber am Rand von Objekten ist wegen der Texturfilterung der Alphawert auch nicht genau 1 oder 0.



  • Du musst dir halt eine Grenze setzen.
    Aber Alpha-Blending solltest du dabei natürlich nicht einschalten.
    Der Alpha-Kanal wird dann eben nicht für das Blending benutzt, sondern nur für das Testing.

    Kannst du mal ein Bild posten?



  • Stimmt. Irgendwie hatte ich da nen Denkfehler, es gibt ja keinen echten Grund, Alphablending anzuschalten. Danke für diesen trivialen aber wichtigen Hinweis. Ich probier' jetzt mal weiter rum, wenn es nichts wird, melde ich mich wieder. 🙂



  • Ist der Alpha-Test eigentlich aufwändig oder ist es eher egal, den für alle Subsets angeschaltet zu lassen?


  • Mod

    alphatest schlatet einige optimierungen auf der graphikkarte ab, haengt von der gpu ab wie schmerzhaft das ist.



  • Danke für diese Information. Meine Probleme sind gelöst.


Anmelden zum Antworten