Shader 101: AlphaTest (clip)

Dem einen oder anderen dürfte es selbstverständlich bereits aufgefallen sein, daß der AlphaTest aus den RenderStates in XNA 4.0 verschwunden ist. Der Grund dafür ist, daß sich XNA immer weiter DirectX 10 annähert um einen späteren Umstieg zu erleichtern. Und genau dies ist der Grund, warum der AlphaTest als RenderState verschwunden ist.

Glücklicherweise kann man dies sehr, sehr einfach in einem Shader simulieren. Dazu gibt es sogar einen speziellen Befehl:

clip(x)

clip ist ein sehr einfacher Befehl, der bewirkt, daß der PixelShader zwar weiter ausgeführt wird, der daraus resultierende Pixel aber verworfen wird. Dies passiert nur dann, wenn der Parameter x kleiner als 0.0 ist.

Um nun unseren AlphaTest zu simulieren, verwenden wir im PixelShader einfach folgenden Befehl:

clip(referenceAlpha – input.color.a);

referenceAlpha ist dabei der altbekannte Wert, der bis XNA 3.1 und DirectX 9 im RenderState verwendet wurde. input.color.a der Alpha-Wert des zu rendernden Pixels. Wird das Ergebnis negativ, also wenn der zu rendernde Pixel einen Alpha-Wert größer dem Referenzwert hat, dann wird der Pixel verworfen.

Ein explizites Beispiel spare ich mir mal, da das Ganze ja nicht sonderlich kompliziert ist. Für Fragen, Anregungen und Kritiken stehe ich über die Kommentar-Funktion gerne zur Verfügung.

 

Advertisements

Veröffentlicht am 08.04.2011 in Grundlagen, Shader, XNA, XNA 4.0 und mit , , , , , getaggt. Setze ein Lesezeichen auf den Permalink. 6 Kommentare.

  1. Verstehe ich das richtig, dass Alpha Testing / Clipping(?) dafür gedacht ist, bei Texturen mit großen Transparenz-Bereichen diese Pixel zu ignorieren?

    • Etwas verallgemeinert ist der Alpha-Test ein Verfahren mit dem anhand des Wertes, der im Alpha-Kanal steht bestimmte Pixel verworfen werden. Du hast also Recht. Es greift im Pixel-Test, also nach dem eigentlichen (Hardware-)Clipping, aber vor dem Scissor-, Z-, Stencil-Test und vor der Write-Mask. Näheres dazu auch hier, da habe ich eine nette Grafik erstelt und auch was dazu geschrieben.

  2. Kleiner Nachtrag noch: Schneller ist es natürlich in jedem Fall die „unsichtbaren“ (also transparente) Flächen garnicht erst zu rendern. Dann müssen diese nämlich garnicht erst bis zum Pixel-Shader gelangen 😉

  1. Pingback: SpriteBatch RenderStates XNA 4.0 « "Mit ohne Haare"

  2. Pingback: Shader 101: Clip Planes « "Mit ohne Haare"

  3. Pingback: Shader 101: Grundlagen « "Mit ohne Haare"

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s

%d Bloggern gefällt das: