特定のピクセルを書き込まないようにフラグメントシェーダーに指示するにはどうすればよいですか?


11

WebGLでは、フラグメントシェーダーによって処理される画面スペースクワッドを送信しますが、フラグメントシェーダーに特定の条件下でのみピクセルを書き出させます(たとえば...円の中にあるか、ピクセルは、曲線方程式などで定義された半空間の正の側に属しています。

フラグメントシェーダー内で「ピクセルを書き込まない」と言うことは可能ですか?

これは、アルファブレンディング、これを最初にレンダリングし、ピクセルを描画したくない場所に背景色を配置したり、深度バッファやステンシルバッファでいくつかのトリックを行うなど、他のさまざまな方法を使用して実現できることを知っています。また、レンダリングしたいものと一致するジオメトリの束を作成できることも知っています。

フラグメントシェーダーにピクセルをまったく書き込まないように選択する方法はありますか?

回答:


10

はい、discardフラグメントシェーダーでピクセルの書き込みを回避できます。これは私がGoogleから掘り出したランダムな例です。

これは実際にはフラグメントシェーダーの処理を停止しない場合があることに注意してください(GPUはブロック内のフラグメントを処理する傾向があるため、ブロック内のすべてのフラグメントからのみ破棄すると処理が中止されます)。しかし、フラグメントは出力に書き込まれません。これは基本的に必要なことです。

あなたはこの関連に興味があるかもしれないのパフォーマンスについての質問discard、この1 SO上。

これがWebGLでサポートされているかどうかはわかりません。そうでない場合は、提案の1つにフォールバックする必要があります(アルファブレンディングなど。これが最も簡単だと思います)。


3

このdiscard文は役に立ちます。

決定パスについてはあまり説明しなかったので、簡単なテクスチャルックアップを使用した例を紹介します。

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

(これは、アルファブレンディングについて学ぶ前に書いたサンプルコードの一部です。)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.