Wie kann ich einem Fragment-Shader anweisen, kein bestimmtes Pixel zu schreiben?

11

In einer WebGL möchte ich ein Quad mit Bildschirmabstand senden, das von einem Fragment-Shader verarbeitet wird, aber der Fragment-Shader soll nur unter bestimmten Bedingungen ein Pixel ausschreiben (sagen wir ... dass es sich innerhalb eines Kreises befindet oder dass das Pixel gehörten zur positiven Seite eines Halbraums, der durch eine Kurvengleichung oder etwas anderes definiert ist.

Kann man in einem Fragment-Shader sagen, dass man kein Pixel schreiben soll?

Ich weiß, dass dies mit verschiedenen anderen Methoden erreicht werden kann, z. B. mit Alpha-Blending, zuerst rendern und die Hintergrundfarbe dort platzieren, wo kein Pixel gezeichnet werden soll, oder vielleicht mit den Tiefen- oder Schablonenpuffern einen Trick machen. Ich weiß auch, dass ich eine Reihe von Geometrien erstellen kann, die dem entsprechen, was ich rendern möchte.

Gibt es eine Möglichkeit, den Fragment-Shader dazu zu bringen, überhaupt kein Pixel zu schreiben?

Alan Wolfe
quelle

Antworten:

10

Ja, Sie können discardim Fragment-Shader vermeiden, dass das Pixel geschrieben wird. Hier ist ein zufälliges Beispiel, das ich von Google ausgegraben habe.

Beachten Sie, dass dies die Verarbeitung des Fragment-Shaders möglicherweise nicht tatsächlich verhindert (da die GPU dazu neigt, Fragmente in Blöcken zu verarbeiten; nur das Verwerfen aller Fragmente in einem Block bricht die Verarbeitung ab). Das Fragment wird jedoch nicht in die Ausgabe geschrieben, was im Grunde das ist, was Sie wollen.

Sie könnten an dieser verwandten Frage über die Leistung vondiscard und dieser auf SO interessiert sein .

Ich habe keine Ahnung, ob dies in WebGL unterstützt wird. Wenn dies nicht der Fall ist, müssen Sie auf einen Ihrer Vorschläge zurückgreifen (z. B. Alpha-Blending; ich denke, das wäre am einfachsten).

Gemeinschaft
quelle
3

Die discardAussage ist praktisch.

Sie haben nicht zu viel über Ihren Entscheidungspfad gesagt, daher werde ich ein Beispiel mit einer einfachen Textur-Suche anbieten:

void main() {
    gl_FragColor = texture2D(u_texture, v_uv) * u_color;
    if (gl_FragColor.a <= 0.0) discard;
}

(Das stammt aus einem Beispielcode, den ich geschrieben habe, bevor ich etwas über Alpha-Blending gelernt habe.)

Rutter
quelle